archive

[OOP] Chap4. 자바가 확장한 객체지향 본문

STUDY/Java

[OOP] Chap4. 자바가 확장한 객체지향

seonyounggg 2021. 2. 4. 16:36

스프링을 입문을 위한 자바 객체 지향의 원리와 이해 를 읽고 정리한 글입니다.


abstract키워드 - 추상메서드와 추상클래스

추상메서드(Abstract Method)는 선언부만 있고 구현부가 없는 메서드를 말한다.

추상메서드를 하나라도 갖고 있는 클래스는 반드시 추상 클래스(Abstract Class)로 선언해야 한다.

추상 클래스는 인스턴스를 생성할 수 없으며, 하위 클래스는 반드시 추상 메서드를 오버라이딩 해야한다.

 

생성자

클래스의 인스턴스, 즉 객체를 만들 때는 new 키워드를 사용한다.

반환값이 없고 클래스명과 같은 이름을 가진 메서드를 객체 생성자 메서드, 줄여서 생성자라고 한다.

컴파일 과정에서 인자가 없는 기본생성자가 자동으로 생성된다.

필요시에 인자를 가지는 생성자를 작성할 수 있다. 이 경우에는 기본 생성자가 자동으로 생성되지 않는다.

 

static 블록

클래스가 스태틱 영역에 배치될 때 static 블록이 실행된다.

앞서 프로그램이 시작될 때 모든 패키지와 모든 클래스가 스태틱 영역에 로딩된다고 언급하였는데,

실제로는 해당 패키지, 클래스가 처음으로 사용될 때 로딩된다.

(메모리는 최대한 늦게 사용을 시작하고 최대한 빨리 반환하는 것이 정석이다.)

즉, 그 때 클래스의 static 블록이 실행된다.

동일 클래스의 인스턴스를 여러 개 만들어도 static 블록은 로딩되는 시점에 한 번만 실행된다.

스태틱 블록에서 사용할 수 있는 메서드는 스태틱 멤버 뿐이다.

 

final 키워드

final 키워드가 나타날 수 있는 곳은 클래스, 변수, 메서드 세 가지 뿐이다.

(1) 클래스

상속을 허락하지 않는다.

즉, 하위 클래스를 만들 수 없는 최종클래스라는 의미이다.

(2) 변수

변경 불가능한 상수라는 의미이다. (다른 언어의 const에 해당)

정적 상수는 선언 시에, 정적 생성자(static 블록) 에서 초기화가 가능하다.

객체 상수는 선언 시에, 객체 생성자 또는 인스턴스 블록에서 초기화할 수 있다.

지역 상수 역시 선언 시에, 또는 최초 한 번만 초기화가 가능하다.
(3) 메서드

재정의, 즉 오버라이딩을 허락하지 않는다.

 

instanceof 연산자

instancof 연산자는 만들어진 객체가 특정 클래스의 인스턴스인지 물어보는 연산자이며, true/false를 반환한다.

System.out.println(객체참조변수 instanceof 클래스명);

이 때, 객체참조변수의 타입이 아닌 실제 객체 타입에 의해 처리된다.

상속 관계뿐만 아니라 인터페이스의 구현 관계에서도 동일하게 적용된다.

 

package 키워드

package 키워드는 namespace를 만들어주는 역할을 한다.

동일한 이름의 클래스들이 있다면, 패키지를 나누어 충돌을 피할 수 있다.

 

interface키워드와 implements 키워드

인터페이스는 public 추상 메서드와 public 정적 상수만 가질 수 있다.

따라서 메서드에 public, abstract, 속성에 static, final을 붙이지 않아도 자동으로 적용된다.

(자바8부터는 디폴트 메서드라고 하는 객체 구상 메서드와 정적 추상 메서드를 지원한다.)

 

this 키워드

this 키워드는 객체가 자기 자신을 지칭할 때 쓰는 키워드이다.

지역 변수와 객체 변수의 이름이 같은 경우, 지역변수가 우선한다.

객체 변수를 사용하고 싶다면 this.var라고 지칭한다.

정적 변수의 경우 클래스명.var로 지칭한다.

 

super 키워드

super는 바로 위 상위 클래스의 인스턴스를 지칭하는 키워드이다.

super 키워드를 통해 상위 인스턴스의 메서드를 호출할 수 있다.

 

+) 참고

똑같은 객체 멤버 메서드를 힙 영역에 반복해서 만드는 것은 메모리 낭비이다.

따라서 JVM은 객체 멤버 메서드를 스태틱 영역에 단 하나만 보유한다.

그리고 해당 메서드를 호출할 때, 객체 자신을 나타내는 this 객체 참조 변수를 넘긴다.

 

 

Comments