728x90

 

간간히 남아있는 List에 대한 기억을 되살리면서

List 한번 써봄

 

package chap12_Collection.A_List.controller;

import java.util.ArrayList;
import chap12_Collection.A_List.model.vo.Student;


public class ListController {
	
	public void method01() {

		ArrayList<Student> list = new ArrayList<Student>(3);
		
		// add(E e):boolean
		list.add(new Student("김철수",0));
		list.add(new Student("최철수",100));
		list.add(new Student("박철수",70));
		
		System.out.println("list = "+list); // list = [김철수(0점), 최철수(100점), 박철수(70점)]
		// ArrayList는 ___의 ____를 ____했기 때문에 list만 찍어도 안에 내용이 나온다
		// Object의 toString()를 오버라이딩 했기에
		
	
		// 장점1. 크기 제약 x
		// 값 추가 & 추가시, 자동 길이 추가
		list.add(new Student("이철수",80)); // 길이 3 -> 4로 자동추가
		System.out.println("list에 담긴 element 개수 : "+list.size());
	
	
		// 장점2. 추가/삭제/정렬 기능처리 간단
		// add(int index, E elemnet) 
		list.add(0, new Student("황철수",55)); // 0번 인덱스 자리에 객체추가
		System.out.println(list); // [황철수(55점), 김철수(0점), 최철수(100점), 박철수(70점), 이철수(80점)]
		System.out.println("list에 담긴 element 개수 : "+list.size()); // list에 담긴 element 개수 : 5
		
		
		// 삭제
		// remove(int index):E
//		// remove()의 return은 삭제한 값을 돌려준다
		Student stu = list.remove(4);
		System.out.println(stu);	// 이철수(80점)
		System.out.println(list);	// [황철수(55점), 김철수(0점), 최철수(100점), 박철수(70점)]
		
		
		
		// 삭제
		// remove(Object o):boolean
		list.remove(new Student("박철수",70)); // 주소값 비교
		System.out.println(list.remove(new Student("김철수",0))); // true -> boolean 반환
		System.out.println("list : " +list);  // list : [황철수(55점), 김철수(0점), 최철수(100점)]
		

	}
	

	
}

 

728x90
반응형
728x90

 

객체배열에서는 Arrays.toString을 해도 객체가 여러개라 안먹힌다는 점

그래서 인덱스 번호 하나씩 찍고 vo클래스의 toString 메소드로 출력해야 값이 나온다는 점 기억!

배열 안에 객체 넣는 부분도 꽤나 익숙해짐. 어버버하는 부분이 꽤 많이 줄었다

 

/******************************** Object Array practice 3rd ***************************************/	

		//객체배열
		//
		// 배열 선언 : Stack 영역에 공간 생성(변수의 선언 : stack에 공간 차지)
		// 배열 할당 : heap 영역에 공간 생성
		// 배열 초기화 : 인덱스,중괄호,for문
		// 배열 삭제 : null
		// 배열 값 출력하는 방법 2가지 : for문 + vo클래스 toString메소드
		
		// 객체배열 선언
		Person02[] oArr000;
		// 객체배열 할당
		Person02[] oArr001 = new Person02[3];
		Person02[] oArr003 = new Person02[3];
		
		// 초기화
		// 	방법1 : index
		oArr001[0] = new Person02("박",25,'M',161,65);
		oArr001[1] = new Person02("강",22,'F',161,45);
		oArr001[2] = new Person02("최",22,'F',161,45);
		
		// 	방법2 : 중괄호
		// 객체배열 선언,할당과 동시에 초기화
		Person02[] oArr002 = {new Person02("김",29,'M',171,62),
				new Person02("이",28,'M',192,83),
				new Person02("최",25,'M',185,81)
		};
		
		//  방법3 : for문
		for(int i=0; i < oArr003.length; i++) {
			oArr003[i] = new Person02("a",i+20,'M',i+170,i+60);
			System.out.println(Arrays.toString(oArr003));
		}
		
//		System.out.println(Arrays.toString(oArr003[1])); // error : toString // The method toString(long[]) in the type Arrays is not applicable for the arguments (Person02)
		System.out.println(oArr003[1].personInfo());
		
		for(int i=0; i < oArr003.length;i++) {
			System.out.println(oArr003[i]); // chap06_objectArray.model.vo.Person02@33909752
		}
	
		oArr003 = null;
		System.out.println(Arrays.toString(oArr003)); // null

		System.out.println(oArr001[0].personInfo()); 
		
		for(int i=0; i < oArr001.length; i++) {
			System.out.println(oArr001[i].personInfo()); 
		}
728x90
반응형
728x90

 

다형성(Polymorphism)

다양한 형태를 지니고 있다고 해서 다형성

부모타입 레퍼런스로 자식 타입 객체를 받아올 수 있는 것

부모타입 레퍼런스에 자식 타입 객체를 담을 수 있는 것

// 기존
Animal a = new Animal(); // o
Dog d = new Dog();       // o
Snake s = new Snake() ;  // o

// 다형성
Animal a1 = new Dog();   // o
Animal a2 = new Snake(); // o  이를 업캐스팅(Upcasting)이라고 함

상속을 전제로,

부모 타입으로 만들어진 자식 객체를 부모 클래스 타입으로 다룰 수 있는(담을 수 있는) 기능

자식을 부모에게 담는 것

자식 객체를 부모타입에 담는 것을 다형성

 

Class의 형변환 (Upcasting, Downcasting)

형변환은 클래스 사이에서 일어나는데 자바의 상속 관계에 있는 부모와 자식 클래스 간에는 서로 형변환이 가능

1)upcasting

upcasting은 서브타입의 인스턴스를 수퍼타입의 변수로 접근하는 것을 말합니다.

즉, 자식 클래스가 부모 클래스 타입으로 캐스팅 되는것을 뜻합니다.

이때 서브 타입에서는 수퍼타입에 선언된 필드 혹은 메서드만 접근 가능합니다.

 

2) down casting

downcasting은 서브타입 인스턴스를 참조하는 수퍼타입 변수를 재참조하는 것을 말합니다.

즉, 부모 클래스가 자식클래스 타입으로 캐스팅되는 것을 뜻합니다.

이때 강제형변환이 일어나며, 다운캐스팅한 타입에서 선언된 모든 필드와 메서드에 접근이 가능합니다.

출처 : https://viera.tistory.com/3

 

업캐스팅 : 부모타입 자식객체

다운 캐스팅 : 부모타입 참조변수를 자식 클래스 타입으로 형변환

→ 자식객체의 멤버에 접근(참조)가능

 

 

1. 부모 타입 레퍼런스로 부모 객체를 다룰 때

2. 자식 타입 레퍼런스로 자식 객체를 다룰 때

3. 부모 타입 레퍼런스로 자식 객체를 다룰 때

4. 자식 타입 레퍼런스로 부모 객체를 다룰 때

 

자식 타입 레퍼런스로 부모 객체를 다룰 때 : 에러 이유

4번 자식 타입 레퍼런스로 부모 객체를 다룰 때, 에러 이유

에러 이유 : 확장된 Child2가 Parent 더 기능이 많은데, 기능이 적은 Parent가 확장된 Child2의 부분을 맞춰줄 수 없기 때문

즉, 없는 값까지 불러와야 하니 에러

 

 

객체배열에서의 다형성

객체타입이 다른 4개의 배열을 하나에 담을 수 없지만 객체배열 다형성 덕에 가능해짐

 

instanceof

객체 자체비교하기 위한 연산자

레퍼런스 변수가 해당 타입의 객체를 참조하고 있는지 확인할 때 사용

true / false

ex) 레퍼런스 A instanceof 클래스타입 B

= a가 b타입의 객체를 참조하니?

A instanceof B : A가 B타입의 객체를 참조하니? 라고 물어보는 것

A(레퍼런스) instanceof B(클래스타입) :  A가 B타입의 객체를 참조하는가

instance, 객체라는 뜻

of, ~의라는 뜻

 


 

동적 바인딩 & 정적 바인딩

바인딩 : 묶여있는 것

프로그램이 실행할 때 모든 코드들은 다 바인딩이 되어있다(묶여있다)

이 메소드를 진짜로 실행한 메소드를

코드로써 실제로 실행할 메소드까지 연결시켜주는걸 바인딩한다고 함

모든 코드들은 정적 바인딩이 되어있음

 

1.정적 바인딩

정적 바인딩이란?

코드만 보고 바인딩 시키는 것

컴파일 할 때 연결되서 바인딩되는 것

정적 바인딩

. 은 ~안에 뜻

pArr[i].print(); // 패런트타입 pArr[i] 안에 print()메소드 ( pArr[i] > print() )

패런트에 있는 프린트해와야겠다

 

2.동적바인딩

내가 막 실행할려고 컴파일,오류검사등 다 마치고 막 실행할려고 할 때 그 실행할 객체를 기준으로 해서 바인딩이 바뀌는 것

윗줄 예시로 보면 pArr[i] 안에 객체가 패런트가 아니고 윗줄

기준이 실행할 객체 타입으로 다시 바인딩이 바뀜=동적바인딩

동적 바인딩 적용 조건

다형성과 오버라이딩이 적용되어있다는 전제

728x90
반응형
728x90

 

 

오버라이딩(Overriding)

자식이 부모한테 상속받은 메소드를 재작성하는 것

부모 클래스가 가진 기능을 자식 클래스가 재정의(추가,수정 등)하는 것

    *부모클래스를 자식클래스가 호출하는 개념

 

조건

  1. 부모 메소드 이름과 같아야한다
  2. 매개변수 전부 동일
  3. 반환타입 동일  ↔ 오버로딩은 반환타입 영향x 매개변수만 영향
  4. 부모 메소드가 private이면, 그 메소드는 오버라이딩 불가
  5. final 메소드 오버라이딩 불가

*final 종단 의미. 변경 불가, 여기까지 끝

변수 외에도 메소드,클래스에도 가능(예약어)

 

 

상속불가 조건

부모가 final,private면 상속불가

[접근제한자] [예약어] 반환형 메소드명 ( [매개변수] ) {}

  상속불가 조건                     선언부라고 부름

                           (선언부가 부모자식 동일해야함)

 

상속불가 조건 선언부라고 부름

 

 

@Override 

오버라이드 어노테이션

오버라이딩 했다는 표시 : 어노테이션(Annotation, 주석)

첫글자 대문자 아니면 빨간줄 에러남

@Override 붙이고 메소드명 변경하면 빨간줄 에러 발생

오버라이딩이 잘되고 있는지 검사해서 알려주는 것이 @Override

 

 


 

 

오버로딩(overloading)

한 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는 것

 

조건

같은 메소드 이름 다른 매개변수 선언부(매개변수 타입, 개수, 순서)

메소드의 리턴타입은 오버로딩 조건과 관계 없음

 

 

 

상속에서 오버라이딩한 예

 

toString 작성하는 것도 오버라이딩 한 것

@Override
public String toString() {
	return "Sub [x=" + x + ", y=" + y + ", a=" + a + "]";
}

 

 

728x90
반응형
728x90

 

 

new 연산자 다음 vo클래스명 작성하고 그 다음 소괄호, 중괄호 같은 것들이 아직 헷갈리는 중

첫번째 할 때는 그냥 일반 배열에서의 초기화 3가지 방법에 대해 잘 적용하지 못했고 생각도 잘못했는데

2번째 되면서 방법2인 중괄호 방법도 적용 시키는데 성공하고 좀 틀이 잡힌 느낌

숙련도가 올라가는 느낌이 든다

 

/******************************** Object Array practice 2nd ***************************************/	
	
	public void objectArr02() {
		
		// 객체배열
		//
		// 배열 선언 : Stack 영역에 공간 생성(변수의 선언 : stack에 공간 차지)
		// 배열 할당 : heap 영역에 공간 생성
		// 배열 초기화 : 인덱스,중괄호,for문
		// 배열 삭제 : null
		// 배열 값 출력하는 방법 2가지 : for문 + vo클래스 toString메소드
		
		// 배열 선언
		Person[] oArr;
		
		// 배열 선언 & 할당
		Person[] obArr = new Person[3];
		
		// 배열 초기화
		// 	방법1 : index
		obArr[0] = new Person("킴",20,'M',173,69);		// 중괄호가 아닌 소괄호
		obArr[1] = new Person("choi", 22, 'M', 165,45);
		obArr[2] = new Person("yu",32,'M',173.2,72.3);
		
		// 	방법2 : 중괄호
		Person02[] obArrr000 = {new Person02(),
new Person02(),
new Person02()
								};
		
		
		// 	방법3 : for문
		Person02[] obArrr = new Person02[5];
		for(int i=0; i < obArrr.length; i++) {
			obArrr[i] = new Person02("a",1,'M',1,1);
			System.out.println(obArrr[i].personInfo()); // 객체값 출력
		}
		// 이중포문으로 객체 안 숫자 증가시켜보기
		for(int i=0; i < obArrr.length;i+=2) {
			int j=1;
			for(; j < obArrr.length; j++) {
				obArrr[i] = new Person02("a",j,'M',j+10,j+20);
				System.out.println(obArrr[i].personInfo());
			}
		}
		
		// 객체 배열 : 출력
		// 
		for(int i=0; i < obArrr.length; i++) {
			obArrr[i] = new Person02();
			System.out.println(obArrr[i] + " ");		// 주소값 출력
			System.out.println(obArrr[i].personInfo()); // 객체값 출력
		}
		
		System.out.println("====null====");
		System.out.println(Arrays.toString(obArrr)); // [chap06_objectArray.model.vo.Person02@6d06d69c, chap06_objectArray.model.vo.Person02@7852e922, chap06_objectArray.model.vo.Person02@4e25154f, chap06_objectArray.model.vo.Person02@70dea4e, chap06_objectArray.model.vo.Person02@5c647e05]
		System.out.println(obArrr[0].personInfo());  // null, 0,  0.0, 0.0
		obArrr = null;
		System.out.println(Arrays.toString(obArrr)); // null
		
		Person02[] objArr001;
		Person02[] objArr002 = new Person02[5];
		objArr002[0] = new Person02("a", 1,'M',171,66.2);
		objArr002[1] = new Person02();
		objArr002[2] = new Person02();
//		objArr002[2] = new Person02(Person02.getName()); // Person02클래스의 게터에서 값을 끌어올 수 있을까 해서 해봄 
		// 스태틱 요구함 Cannot make a static reference to the non-static method getName() from the type Person02
		Person02[] objArr004 = {new Person02(),
								new Person02("철희", 32, 'M', 171,56),
								new Person02("영희", 32, 'W', 161,46)
								};

		Person02[] objArr003 = new Person02[5];
		for(int i=0; i < objArr003.length; i++) {
			objArr003[i] = new Person02(); 
			System.out.println(objArr003[i].personInfo());
		}
		
	

	}
728x90
반응형
728x90

 

상속(Inheritance)

부모 클래스가 가지고 있는 멤버(필드or메소드)를 자식 클래스에게 넘겨주는 것

자식은 부모를 확장한 것

다른 클래스가 가지고 있는 멤버(필드, 메소드)들을 새로 작성할 클래스에서 직접 만들지 않고 상속을 받음으로써, 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능

 

명령어 : extends

[접근제한자] class 클래스명 extends 클래스명{}

 

 

상속 명칭

부모클래스 = 조상클래스 = 상위클래스(super class)

자식클래스 = 자손클래스 = 하위클래스(sub class)

 

 

상속 목적

1.클래스의 재사용 가능

2.공통적인 규약 정의

 

 

상속 장점

1.코드량 감소

직접 만들지않고 부모클래스를 가져다 쓰기 때문

적은 양의 코드로 클래스 작성 가능

 

2.코드 추가,삭제,변경 용이

부모클래스의 데이터가 공통분모가 되서 일괄변환됨

코드를 공통적으로 관리하기 때문에 코드 추가/변경 용이

 

3.중복 제거 → 생산성,유지보수up

 

 

상속 특징

1.모든 클래스는 Object클래스의 후손(=Object는 최상위 클래스)

    Object클래스가 제공하는 메소드를 오버라이딩하여 메소드 재구현 가능

         ex) java.lang.String 클래스의 equals()와 toString()

부모클래스로부터 멤버(필드,메소드) 받아오는 것

 

2.부모 클래스의 생성자, 초기화 블록은 상속 안됨

자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행

자식 클래스 생성자 안에 부모 클래스 생성자를 호출하고 싶으면 super() 활용

    - 부모클래스에 접근하는 방법 : super()

 

3.부모의 private멤버는 상속은 되지만 직접 접근 불가

자식 객체 생성 시에 부모의 필드 값도 전달 받은 경우, 자식 생성자 안에서 부모의 private 필드에 직접 접근하여 대입 불가

(private 접근 범위, 해당 클래스 안이기에 직접적으로는 접근 불가)

 

접근 하는 방법

  1. super() 이용하여 전달받은 부모 필드 값을 부모 생성자 쪽으로 넘겨 생성
  2. setter, getter 메소드를 이용하여 접근

 

*부모클래스와 자식클래스의 주소값은 다르다

(=참조하고 있지 않다는 의미. 주소값이 다르기에 )

부모클래스의 객체 주소값은 고정되어있지 않다

자식 클래스라고 해서 부모클래스가 그대로 들어가지 않는다

 

 

자바의 단일상속, 다중 상속

※ 다중 상속

C++에서 사용 가능한 기능

여러 클래스로부터 상속이 가능하며 복합적인 기능을 가진 클래스를 쉽게 생성 가능

    - 서로 다른 클래스로부터 상속받은 멤버 간의 이름이 같은 경우 문제 발생

 

자바에서 다중상속 불가

단일 상속만 가능. 만약 다중상속이 필요하면 단일 상속을 여러번 사용해서 구현 가능

하나의 자식에 여러 부모 불가

하나의 부모에 여러 자식 가능

화살표 : 아래에서 위로

자식이 부모를 가리키는 것

고로, 자식 클래스에서 부모클래스를 화살표가 가리켜야 한다

상속에서 쓰이는 화살표는 머리가 빈 화살표시

 

 

상속 시 딱 하나만 상속 받아오는 것

자바에서는 다중상속하지 않고 단일 상속을 지원함

why?

어느 클래스에서 받아왔는지 알기가 어려워지기 때문 단일 상속만 지원

클래스간의 관계가 다중 상속보다 명확하고 신뢰성 있는 코드 작성가능

 

자바에서 다중상속이 필요한 경우,

단일 상속을 여러번해서 다중상속을 표현할 수 있다

 

 

※ 해당 필드나 getter,setter가 어느 클래스에 속한지 알아볼 때 유용한 팁

대쉬 안에 있는건 어디 안에 있는 메소드인지 보여주는것

 

 

상속의 예시

Object에 있는 메소드들

어떻게 들어가 있을 수 있을까?

모든클래스는 object클래스 후손이기 때문

내가 만든 클래스(사용자 정의 클래스)도 object의 후손이기 때문에 object 안에 있는 클래스들을 다 상속 받은거고 사용할 수 있는 것

.

java.lang.Object

모든 클래스의 부모클래스

최상위 클래스라고 부른다

 

 

728x90
반응형
728x90

배열에 객체가 들어가다보니 기존 배열보다 좀 까다롭다는 느낌이 들었다

배열 안에 있는 객체 속성값에 접근해서 출력하는게 기존과는 달라서 좀 헤맸다는 것

기존 기본형 자료타입들과 다르게 객체타입이다보니 헷갈리는게 많았다는 것

아직은 숙련도가 많이 부족해서 계속 반복해서 내 손발처럼 될 수 있게 연습해야겠다

 

package chap06_objectArray.controller;

import java.util.Arrays;

import chap06_objectArray.model.vo.Person;

public class Person02Controller {
	
	public void objectArr00() {
		
		// 예제
		// 출처 :http://daplus.net/java-java%EB%A1%9C-%EA%B0%9D%EC%B2%B4-%EB%B0%B0%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0/
		
		// 1.선언 및 인스턴스화
		A[ ] arr = new A[4];
		
		// 2.객체 초기화
		// 방법1
		arr[0] = new A();
		arr[1] = new A();
		arr[2] = new A();
		arr[3] = new A();
		
		// 방법2
		for( int i=0; i<4; i++ ) {
			  arr[i] = new A();
		}
		// 방금 만든 객체에서 기존 메소드 호출 가능해짐
		// 방법1
		int x = arr[1].getNumber();
		// 방법2
		arr[1].setNumber(x);
		
	}
	
	public void objectArr01() {
		
		// 객체배열
		//
		// 배열 선언 : Stack 영역에 공간 생성(변수의 선언 : stack에 공간 차지)
		// 배열 할당 : heap 영역에 공간 생성
		// 배열 초기화 : 인덱스,중괄호,for문
		// 배열 삭제 : null
		// 배열 값 출력하는 방법 2가지 : for문 + vo클래스 toString메소드
		
		
		
		
		// 배열 선언 - stack 영역에 생성
		String objArr;
		
		// 배열 할당 - heap 영역에 생성
		Person[] objArr01 = new Person[3];
		
		// 초기화
		//	1)인덱스
		objArr01[0] = new Person();
		objArr01[1] = new Person("김철수", 20, 'M', 170.5, 70);
		objArr01[2] = new Person("이순신", 40,'M', 180.5, 85.5); 

// vo Person		
//		private String name;
//		private int age;
//		private char gender;
//		private double height;
//		private double weight;
		
		// 	2) 중괄호
		Person objArr02 = new Person("안중근", 30,'M', 175.5, 75.3);
		Person[] objArr03 = {new Person("유관순", 18,'F', 160.2, 45.5),
							 new Person("신사임당", 40,'F', 157.5, 43.2),
							 new Person("세종대왕", 55, 'M', 180.5, 80.5)
							};
		System.out.println(objArr02); // chap06_objectArray.model.vo.Person@6d06d69c
		System.out.println(Arrays.toString(objArr03)); // 객체주소값 출력 : [chap06_objectArray.model.vo.Person@6d06d69c, chap06_objectArray.model.vo.Person@7852e922, chap06_objectArray.model.vo.Person@4e25154f]

//		System.out.println(Arrays.toString(objArr02[0])); // The type of the expression must be an array type but it resolved to Person
//		for(int i=0; i < objArr02.length; i++) { // 
//			System.out.println(objArr02[i]);	// The type of the expression must be an array type but it resolved to Person
//		}										// for문 출력은 int나 int로 자동형변환되는 소수들이 가능
		
		
		// 	3) for문
		Person[] objArr04 = new Person[3];
		for(int i=0; i < objArr04.length; i++) {
			objArr04[i] = 
		}
		
		
		// 객체 주소값 출력
		for(int i=0; i < objArr03.length; i++) {
			System.out.println("objArr03 = "+objArr03[i]);
//				objArr03 = chap06_objectArray.model.vo.Person@7852e922
//				objArr03 = chap06_objectArray.model.vo.Person@4e25154f
//				objArr03 = chap06_objectArray.model.vo.Person@70dea4e
		}
		// vo클래스 toString()을 이용한 객체속성값 출력
		for(int i=0; i < objArr03.length; i++) {
			System.out.println(objArr03[i].personInfo());
//				유관순, 18, F, 160.2, 45.5
//				신사임당, 40, F, 157.5, 43.2
//				세종대왕, 55, M, 180.5, 80.5
		}
//		System.out.println(Arrays.toString(objArr03.personInfo())); // Cannot invoke personInfo() on the array type Person[]
//		System.out.println(Arrays.toString(objArr03[0].personInfo())); // The method toString(long[]) in the type Arrays is not applicable for the arguments (String)
//		System.out.println(Arrays.personInfo()); // toString빼고 바로 출력할려했으나 에러 : The method personInfo() is undefined for the type Arrays
		
		// 삭제
		objArr03 = null;
		System.out.println(objArr03); // null
		System.out.println(Arrays.toString(objArr03)); // null
		for(int i=0; i < objArr03.length; i++) {
			System.out.println(objArr03[i].personInfo()); // Exception in thread "main" java.lang.NullPointerException
		}
		
		
	}
	
	
	
}
728x90
반응형
728x90

 

객체 배열

객체를 담는 배열

배열의 자료형을 클래스명(사용자 정의 자료형)으로 지정하여 활용

 

선언

자료형[] 배열명;

자료형 배열명[];

클래스명[] 배열명;

클래스명 배열명[];

 

할당

배열명 = new 자료형[길이];

배열명 = new 클래스명[길이]

자료형[] 배열명 = new 자료형[길이];

클래스명[] 배열명 = new 클래스명[길이];

 

 

 

초기화

배열명[인덱스] = 값;

배열명[인덱스] = new 클래스명();

 

iArr[0] = 10;

tArr[0] new Trainee();

iArr = {1,2,3};

tArr = {new Trainee(),new Trainee()};

 

 

선언과 동시에 할당 및 초기화

클래스명 배열명[] = {new 클래스명(), new 클래스명()};

 

 

객체 배열의 메모리 작동

선언된 변수명이 stack에서 공간이 만들어지고, 거기서 할당되면서 heap에서 공간이 생성되는데

이때,  배열 하나의 주소 안에서 배열의 각 인덱스번호 별로 주소가 다시 나눠지는 구조

 

728x90
반응형
728x90

 

사용 프로그램

java + eclipse

 

메세지

Exception in thread "main" java.lang.Error: Unresolved compilation problem :

The constructor User(String,String) is undefined

 

상황

생성자 매개변수 실험

 

원인

실행 클래스의 매개변수 생성자에서 값 초기화를 3개했는데 

new User() 생성자에서는 매개변수를 2개만 줬기 때문에 에러발생

 

해결

매개변수 2개를 3개로 맞춘다

new User("user1","pass1","pass2")

 

728x90
반응형
728x90

 

메소드(method)

다른 프로그래밍 언어에는 함수라는 것이 별도로 존재한다. 하지만 자바는 클래스를 떠나 존재하는 것은 있을 수 없기 때문에 자바의 함수는 따로 존재하지 않고 클래스 내에 존재한다.

자바는 이러한 클래스 내의 함수를 메소드라고 부른다.

※ 보통 함수와 메소드가 공존하는 언어(예:파이썬)에서는 두 개를 구분하여 말하기도 하지만 자바는 보통 메소드와 함수를 구분하여 말하지 않는다. 다만 자바에서 사용되는 함수의 정확한 명칭은 메소드

위 내용의 출처 : 점프투자바

 

역할

입력을 가지고 어떤 일을 수행한 다음에 결과물을 내어놓는 것, 이것이 메소드가 하는 일

 

구조

입력값 -> 메소드 -> 리턴값

메소드는 들어온 입력값을 가지고 어떤 처리를 하여 적절한 리턴값을 돌려주는 블랙박스와 같다.

기능부분에 생성자도 있지만 메소드도 있다

 

 

메인메소드( main method)

메인메소드는 모든 형태를 다 가지고 있다

public static void main(String[] args) {
[접근제한자] [예약어] 반환타입 메소드명(매개변수) {

  - 생략가능 : 접근제한자 예약어 매개변수

 

  1. 접근 제한자
  2. 예약어
  3. 반환타입
  4. 매개변수
  5. 표현식 종류 4가지

 

접근제한자 : public private protected default

예약어 : static final 등

반환타입 :

     A. void : 반환할 게 없음. 반환값이 없다고해서 안쓰면 생성자처럼 됨. 필히 쓸 것

     B.기본자료형을 반환하는 메소드

           ex) Integer.parseInt, chataAt(), Math.random(), String.equals(),String.length() 등등

C.배열을 반환 : Arrays.copyOf()

D.클래스를 반환 : Scanner.nextLine() .nextInt 등등

메소드명

매개변수

 


1) 접근 제한자

 

2) 예약어

 

3) 메소드 반환형

 

4)메소드 매개변수

1.() : 매개변수 없음 = 전달할 값이 없음

2.기본자료형

3.배열 : 얇은 복사(주소값)

4.클래스

5.가변인자 : 매개변수의 개수가 정해지지 않은 유동적 설정

      ex)printf() - 공식API문서 printstream 확인가능

자료형... 변수명 // ...은 가변의미를 나타냄

 

※ 매개변수와 인수

public class Sample {
    int sum(**int a, int b**) {  // a, b 는 **매개변수**
        return a+b;
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        int c = sample.sum(**3, 4**);  // 3, 4는 **인수**

        System.out.println(c);  // 7 출력
    }
}

 

5) 표현식 종류 4가지

1)반환타입 o 매개변수 o 메소드

2)반환타입 o 매개변수 x 메소드

3)반환타입 x 매개변수 o 메소드

4)반환타입 x 매개변수 x 메소드

 

 


 

메소드와 생성자 구분법

구분기준 : 반환 여부

public Book() {

} // 반환타입이 없으므로 생성자

반환타입 o : 메소드

반환타입 x : 생성자

728x90
반응형

+ Recent posts