- 클래스는 라이브러리(API) 또는 실행 클래스(main())로 사용된다.
- this() - 동일 클래스의 생성자를 호출할 수 있다. 생성자 오버로딩 할 때 사용하고, 첫줄에 작성해야 한다.
- 메소드 작성 시, 매개변수의 개수를 모른다면
- 배열 타입으로 선언하거나 - int sum1(int[] values)
- 값의 목록만 넘긴다. - int sum2(int ... values) <- 호출할 때 값의 목록을 직접 넘긴다. sum2(1,2,3) 이렇게.
- 두 방법 다 자바는 배열로 입력을 받는 것이다.
- return문을 통해 메소드를 종료 시킨다.
- 메소드 오버로딩 - JVM은 매개값의 타입을 보고 메소드를 결정한다.
- 인스턴스 멤버(필드와 메소드)는 인스턴스가 생성되야 사용 가능하고, 인스턴스 이름으로 접근 가능하다.
- 정적 멤버(필드와 메소드, static을 붙여 선언)는 메소드 영역에 로딩되고, 객체가 생성되지 않아도 접근 가능하다.
(클래스 이름으로 접근) - 메소드가 인스턴스 멤버, this를 포함하면 인스턴스 메소드로 선언하고, 그렇지 않고 static 필드만 사용하거나 일반 매개변수를 사용하면 정적 메소드로 선언한다.(객체가 없이도 사용가능해야 해서 그렇다.)
변수 유형 | 선언 위치 | 사용 범위 | 메모리 | 생성과 소멸 |
지역 변수 (로컬 변수) |
함수 내부에 선언 | 함수 내부에서만 사용 | 스택 | 함수가 호출될 때 생성되고 함수가 끝나면 소멸 |
멤버 변수 (인스턴스 변수) |
클래스 멤버 변수로 선언 | 클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서 사용 가능 | 힙 | 인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨. |
static 변수 (클래스 변수) |
static 키워드를 사용하여 클래스 내부에 선언 | 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능 | 메소드 영역 | 프로그램이 처음 시작할 때 상수화 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸됨. |
- 만약 정적 메소드로 인스턴스 멤버를 사용하려면, 객체 생성 후, 참조변수로 정적 메소드를 접근하고 인스턴스 멤버를 접근한다. 같은 방법으로 자기 클래스의 객체를 생성해 같은 클래스의 멤버를 사용할 수 있다.
- 싱글톤 - 전체 프로그램에서 단 하나의 객체만 만드는 코딩 기법(단일객체)
- 생성자 앞에 private를 붙인다.(다른 클래스에서 객체를 생성할 수 없도록)
- 클래스 내부에서 자신 객체를 생성한다.(private static)
- 그 객체를 리턴하는 정적 메소드를 생성한다.(static)
- 패키지는 물리적으로 파일 시스템의 폴더이다. 클래스를 체계적으로 관리하기 위해 사용한다.
- import 문을 통해 다른 패키지의 클래스 또는 인터페이스를 가져온다. 따라서 상위 패키지를 import 하더라도 하위 패키지의 클래스를 사용하기 위해선 따로 import 해야 한다.
- 다른 패키지의 같은 이름의 클래스를 사용하려면, import 할 때 클래스 이름 전체를 작성한다.
- 접근 제한자의 종류
- public - 외부에서 자유롭게 사용 가능
- private - 외부에서 사용 못함. 내부에서만 가능.
- default - (접근 제한자를 적지 않았을 때) 같은 패키지에 속한 클래스에서 사용 가능.
- protected - 같은 패키지의 클래스 또는 해당 클래스를 상속 받은 외부 패키지의 클래스에서 접근 가능하다.
외부 클래스 | 하위 클래스 | 동일 패키지 | 내부 클래스 | |
public | O | O | O | O |
protected | X | O | O | O |
default | X | X | O | O |
private | X | X | X | O |
- 다른 클래스의 인스턴스를 생성할 수 있더라도 그 인스턴스의 멤버를 사용할 수 있는 것은 아니다.(생성자와 멤버의 접근제한자는 다를 수 있기 때문에)
- Getter 메소드와 Setter 메소드
- 외부 접근으로 객체의 무결성이 깨질 수 있어 보통 필드는 private로 선언함.
- 그래서 간접적으로 (private가 아닌)메소드를 통해 필드에 접근하도록 함.
- 필드 값을 set 하는 메소드를 Setter 메소드, get 하는 메소드를 Getter 메소드라고 부른다.
- Setter 메소드에 검증코드를 넣어 값을 전달할 수 있고, Getter 메소드는 필드값을 가공해 전달할 수 있다.
- 상속 받으면 생성자도 상속 받는다.
- 상위 클래스의 private 멤버는 상속받을 수 없다.
- 서로 다른 패키지의 클래스의 상속 관계에서 당연히 defalut 멤버도 상속받을 수 없다.
- 자식 객체 생성자의 처음 코드는 부모 객체 생성자이다. 따라서 자식 객체를 생성하면 먼저 부모 객체가 생성된다.
- super();는 부모 클래스의 기본 생성자이다. 기술하지 않아도 컴파일러가 자동으로 호출하지만, 매개변수를 넘기기 위해 명시적으로 기술할 수 있다.
- 부모 메소드를 재정의 할 때는, 동일한 시그니처를 갖고 접근 제한은 더 강하게 하지 못한다. 또한 새로운 예외를 throws 할 수 없다.
- 메소드 재정의를 하더라도 super 접근자로 부모 메소드를 호출할 수 있다. ex) super.print();
- final 클래스는 상속할 수 없는 클래스, final 메소드는 재정의 할 수 없는 메소드.
상속을 사용하는 경우
- IS-A 관계 is a relationship(inheritance)
- 일반적인(general) 개념과 구체적인(specific) 개념과의 관계
- 상위 클래스: 일반적인 개념 클래스 - 포유류
- 하위 클래스: 구체적인 개념 클래스 - 사람, 원숭이, 고래
- 단순히 코드의 재사용 목적으론 사용하지 않는다.
- HAS-A 관계 composition
- 한 클래스가 다른 클래스를 소유한 관계. 코드 재사용의 방법이다.
- Car가 Engine를 포함한 관계
'study > java' 카테고리의 다른 글
자바/JAVA 인터페이스 - 타입 변환 다형성 (0) | 2021.01.05 |
---|---|
자바/JAVA 인터페이스 정리 (0) | 2021.01.05 |
자바/JAVA 추상 클래스, 추상 메소드, 템플릿 메소드 (0) | 2021.01.04 |
자바/JAVA 다형성 구현 정리 (0) | 2021.01.04 |
자바/JAVA 공부 정리 (0) | 2020.12.28 |