
abstract
추상 메서드: 선언부만 있고 구현부는 없는 메서드 (추상? 공통 특성 추출?)
✓ 추상 메서드를 하나라도 갖고 있는 클래스는 반드시 추상 클래스여야 한다.
→ 추상 메서드는 추상 클래스 안에서만 존재할 수 있다 (인터페이스에도 존재..)
✓ 추상 클래스는 인스턴스(객체)를 만들 수 없는 클래스이다. new 사용 불가
→ 오로지 상속을 통해서만 사용될 수 있다
✓ 추상 클래스를 상속한 하위 클래스는 반드시 추상 메서드를 오버라이딩(구현) 하여야 한다.
그러면 그냥 인터페이스 역할을 하는 클래스가 아닌가? 인터페이스와 차이점이 뭘까?
일단, 인터페이스는 추상 클래스의 하나의 특수한 형태.
추상 클래스는 추상 메서드 말고도 멤버변수, 메서드, 생성자를 선언할 수 있다.
인터페이스는 이 중에서 추상 메서드만 남기고 모든 것을 제거한 형태이다. (음 근데 이제는 이것도 아님)
목적 면에서도, 추상 클래스는 이를 상속하여 재사용, 확장하기 위해 사용하고,
인터페이스는 이를 구현한 객체들에 대해 동일한 동작을 보장하기 위해 사용한다.
interface
인터페이스의 구성 멤버는 오직 다음 네 가지이다.
그리고 일단 모든 멤버는 public 이다.
① 상수 필드 - [public static final]
② 추상 메서드 - [public abstract]
③ 디폴트 메서드 (자바 8에서 추가) - [public] default
④ 정적 메서드 (자바 8에서 추가) - [public] static
public static final, public abstract, public 을 붙이지 않아도 자동으로 붙여준다.
그래도 명시적으로 붙여주자. 명확한 게 좋은 것!
자바 8에서는 람다가 추가됐다.
람다는 변수에 저장할 수 있는 함수(로직)이다. 변수는 메서드의 인자, 반환값으로 사용할 수 있다.
결국 람다로 변수에 로직을 저장할 수 있고, 로직을 메서드의 인자, 반환값으로 쓸 수 있다.
람다는 인터페이스를 기초로 하고 있기 때문에 인터페이스에도 변화가 생겼다. (디폴트 메서드, 정적 메서드)
생성자
인스턴스(객체)를 만들 때마다 new 키워드 사용
사실, 생성자는 객체를 생성하는 메서드이다. 생성자 = 객체 생성자 메서드
반환타입 명시가 없고 클래스 이름과 동일한 이름을 가진다.
클래스에 직접 생성자를 작성하지 않으면 인자가 없는 기본 생성자를 자동으로 만들어준다.
주의! 만약 인자가 있는 생성자를 하나라도 작성한다면 기본 생성자를 만들어주지 않는다.
생성자는 필요한 만큼 오버로딩하여 여러 개 만들 수 있다.
생성자는 객체를 생성하면서 초기화하는 역할을 한다. 기본 생성자는 기본값으로 초기화.
static 블록
객체 생성자가 있다면 클래스 생성자도 있을까? No. 대신 static 블록 'static { } ' 이 있다.
static 블록은 클래스가 Static 영역에 배치될 때 실행되는 코드 블록이다.
주로 static 블록에서 클래스 멤버 변수를 초기화 한다.
클래스는 언제 Static 영역에 로드되는가
해당 클래스가 가장 처음 사용될 때 Static 영역에 로드되고 내려가지 않는다.
즉, 클래스의 정적 속성 혹은 메서드를 사용할 때 / 클래스의 인스턴스를 최초로 생성할 때
이 때 단 한번 해당 클래스의 static 블록이 실행된다.
static 블록에서 사용할 수 있는 멤버는 static 멤버 뿐이다.
당연함. 왜냐면 객체 멤버에는 접근할 방법이 없음.
static 블록이 아닌, 인스턴스를 위한 인스턴스 블록 '{ } ' 도 존재한다.
인스턴스 블록은 인스턴스가 생성될 때마다 실행된다. 그것도 생성자가 실행되기 전에!!!
객체는 주로 생성자를 통해 초기화하기 때문에 인스턴스 블록을 사용할 일은 거의 없긴 하다.
만약 어떤 생성자가 호출되든 그 전에 공통으로 초기화하고 싶은 작업이 있다면 인스턴스 블록에서 처리한다.
↓ 참고 예제 ↓
final
1. final 클래스 : 상속 불가
2. final 변수 : 값 변경 불가, 즉 상수
- 정적 상수: 선언 시 or static 블록에서 초기화
- 객체 상수: 선언 시 or 생성자 or 인스턴스 블록에서 초기화
- 지역 상수: 선언 시 or 최초 한 번만 초기
2. final 메서드 : 오버라이딩 불가
instanceof
instanceof 연산자: 인스턴스(객체)가 특정 클래스의 인스턴스인지 확인하는 연산자
객체참조변수 instanceof 클래스
이때 객체 참조 변수의 타입이 아닌 실제 객체의 타입에 의해 처리한다.
e.g. Penguin extends Animal
1) Penguin obj1 = new Penguin();
obj1 instanceof Animal → true
2) Animal obj2 = new Penguin();
obj2 instanceof Animal → true
obj2 instanceof Penguin → true
인터페이스 구현 관계에서도 동일하게 적용된다.
e.g. Animal implements Barkable, Dog extends Animal
1) Dog obj1 = new Dog();
obj1 instanceof Barkable → true
2) Barkable obj2 = new Dog();
obj2 instanceof Barkable → true
obj2 instanceof Animal → true
obj2 instanceof Dog → true
instanceof 연산자는 주로 리스코프 치환 원칙을 어기는 코드에서 나타나기 때문에 점검이 필요하다.
package
package 키워드는 네임스페이스를 만들어주는 역할을 한다. 특별히 하는 일은 없다.
네임스페이스는 클래스들의 이름 충돌을 피하기 위해 필요하다.
this, super
this 는 객체 멤버 메서드 내부에서 객체 자기 자신을 지칭할 때 쓰는 키워드이다.
지역 변수와 속성(객체 변수, 정적 변수)의 이름이 같은 경우 지역 변수에 우선권이 있다.
그럼에도 객체 변수를 사용하려면 this 를 붙이면 된다.
정적 변수는 클래스명을 붙이면 된다.
super 는 상속 관계에서 바로 위 상위 클래스의 인스턴스를 지칭하는 키워드이다.
super.super 형태로 상위의 상위 클래스의 인스턴스에는 접근이 불가능하다.
객체 멤버 메서드
객체 멤버 메서드는 각 객체별로 달라지는 것이 아니다. 그 안에서 사용하는 객체 멤버 속성의 값만 다르다.
그래서 객체 멤버 메서드는 Static 영역에 단 하나만 생긴다.
그리고 메서드를 호출할 때 객체 자신을 나타내는 this 객체 참조 변수를 넘긴다.
자바의 키워드

'Study > Booooooook' 카테고리의 다른 글
도메인 주도 설계 핵심 1-2장 (0) | 2024.07.19 |
---|---|
자바 객체 지향의 원리와 이해 5. SOLID (0) | 2024.05.25 |
자바 객체 지향의 원리와 이해 3. 객체 지향 (1) (0) | 2024.05.18 |
자바 객체 지향의 원리와 이해 2. 메모리 (0) | 2024.05.07 |
자바 객체 지향의 원리와 이해 1. Intro (0) | 2024.04.18 |

abstract
추상 메서드: 선언부만 있고 구현부는 없는 메서드 (추상? 공통 특성 추출?)
✓ 추상 메서드를 하나라도 갖고 있는 클래스는 반드시 추상 클래스여야 한다.
→ 추상 메서드는 추상 클래스 안에서만 존재할 수 있다 (인터페이스에도 존재..)
✓ 추상 클래스는 인스턴스(객체)를 만들 수 없는 클래스이다. new 사용 불가
→ 오로지 상속을 통해서만 사용될 수 있다
✓ 추상 클래스를 상속한 하위 클래스는 반드시 추상 메서드를 오버라이딩(구현) 하여야 한다.
그러면 그냥 인터페이스 역할을 하는 클래스가 아닌가? 인터페이스와 차이점이 뭘까?
일단, 인터페이스는 추상 클래스의 하나의 특수한 형태.
추상 클래스는 추상 메서드 말고도 멤버변수, 메서드, 생성자를 선언할 수 있다.
인터페이스는 이 중에서 추상 메서드만 남기고 모든 것을 제거한 형태이다. (음 근데 이제는 이것도 아님)
목적 면에서도, 추상 클래스는 이를 상속하여 재사용, 확장하기 위해 사용하고,
인터페이스는 이를 구현한 객체들에 대해 동일한 동작을 보장하기 위해 사용한다.
interface
인터페이스의 구성 멤버는 오직 다음 네 가지이다.
그리고 일단 모든 멤버는 public 이다.
① 상수 필드 - [public static final]
② 추상 메서드 - [public abstract]
③ 디폴트 메서드 (자바 8에서 추가) - [public] default
④ 정적 메서드 (자바 8에서 추가) - [public] static
public static final, public abstract, public 을 붙이지 않아도 자동으로 붙여준다.
그래도 명시적으로 붙여주자. 명확한 게 좋은 것!
자바 8에서는 람다가 추가됐다.
람다는 변수에 저장할 수 있는 함수(로직)이다. 변수는 메서드의 인자, 반환값으로 사용할 수 있다.
결국 람다로 변수에 로직을 저장할 수 있고, 로직을 메서드의 인자, 반환값으로 쓸 수 있다.
람다는 인터페이스를 기초로 하고 있기 때문에 인터페이스에도 변화가 생겼다. (디폴트 메서드, 정적 메서드)
생성자
인스턴스(객체)를 만들 때마다 new 키워드 사용
사실, 생성자는 객체를 생성하는 메서드이다. 생성자 = 객체 생성자 메서드
반환타입 명시가 없고 클래스 이름과 동일한 이름을 가진다.
클래스에 직접 생성자를 작성하지 않으면 인자가 없는 기본 생성자를 자동으로 만들어준다.
주의! 만약 인자가 있는 생성자를 하나라도 작성한다면 기본 생성자를 만들어주지 않는다.
생성자는 필요한 만큼 오버로딩하여 여러 개 만들 수 있다.
생성자는 객체를 생성하면서 초기화하는 역할을 한다. 기본 생성자는 기본값으로 초기화.
static 블록
객체 생성자가 있다면 클래스 생성자도 있을까? No. 대신 static 블록 'static { } ' 이 있다.
static 블록은 클래스가 Static 영역에 배치될 때 실행되는 코드 블록이다.
주로 static 블록에서 클래스 멤버 변수를 초기화 한다.
클래스는 언제 Static 영역에 로드되는가
해당 클래스가 가장 처음 사용될 때 Static 영역에 로드되고 내려가지 않는다.
즉, 클래스의 정적 속성 혹은 메서드를 사용할 때 / 클래스의 인스턴스를 최초로 생성할 때
이 때 단 한번 해당 클래스의 static 블록이 실행된다.
static 블록에서 사용할 수 있는 멤버는 static 멤버 뿐이다.
당연함. 왜냐면 객체 멤버에는 접근할 방법이 없음.
static 블록이 아닌, 인스턴스를 위한 인스턴스 블록 '{ } ' 도 존재한다.
인스턴스 블록은 인스턴스가 생성될 때마다 실행된다. 그것도 생성자가 실행되기 전에!!!
객체는 주로 생성자를 통해 초기화하기 때문에 인스턴스 블록을 사용할 일은 거의 없긴 하다.
만약 어떤 생성자가 호출되든 그 전에 공통으로 초기화하고 싶은 작업이 있다면 인스턴스 블록에서 처리한다.
↓ 참고 예제 ↓
final
1. final 클래스 : 상속 불가
2. final 변수 : 값 변경 불가, 즉 상수
- 정적 상수: 선언 시 or static 블록에서 초기화
- 객체 상수: 선언 시 or 생성자 or 인스턴스 블록에서 초기화
- 지역 상수: 선언 시 or 최초 한 번만 초기
2. final 메서드 : 오버라이딩 불가
instanceof
instanceof 연산자: 인스턴스(객체)가 특정 클래스의 인스턴스인지 확인하는 연산자
객체참조변수 instanceof 클래스
이때 객체 참조 변수의 타입이 아닌 실제 객체의 타입에 의해 처리한다.
e.g. Penguin extends Animal
1) Penguin obj1 = new Penguin();
obj1 instanceof Animal → true
2) Animal obj2 = new Penguin();
obj2 instanceof Animal → true
obj2 instanceof Penguin → true
인터페이스 구현 관계에서도 동일하게 적용된다.
e.g. Animal implements Barkable, Dog extends Animal
1) Dog obj1 = new Dog();
obj1 instanceof Barkable → true
2) Barkable obj2 = new Dog();
obj2 instanceof Barkable → true
obj2 instanceof Animal → true
obj2 instanceof Dog → true
instanceof 연산자는 주로 리스코프 치환 원칙을 어기는 코드에서 나타나기 때문에 점검이 필요하다.
package
package 키워드는 네임스페이스를 만들어주는 역할을 한다. 특별히 하는 일은 없다.
네임스페이스는 클래스들의 이름 충돌을 피하기 위해 필요하다.
this, super
this 는 객체 멤버 메서드 내부에서 객체 자기 자신을 지칭할 때 쓰는 키워드이다.
지역 변수와 속성(객체 변수, 정적 변수)의 이름이 같은 경우 지역 변수에 우선권이 있다.
그럼에도 객체 변수를 사용하려면 this 를 붙이면 된다.
정적 변수는 클래스명을 붙이면 된다.
super 는 상속 관계에서 바로 위 상위 클래스의 인스턴스를 지칭하는 키워드이다.
super.super 형태로 상위의 상위 클래스의 인스턴스에는 접근이 불가능하다.
객체 멤버 메서드
객체 멤버 메서드는 각 객체별로 달라지는 것이 아니다. 그 안에서 사용하는 객체 멤버 속성의 값만 다르다.
그래서 객체 멤버 메서드는 Static 영역에 단 하나만 생긴다.
그리고 메서드를 호출할 때 객체 자신을 나타내는 this 객체 참조 변수를 넘긴다.
자바의 키워드

'Study > Booooooook' 카테고리의 다른 글
도메인 주도 설계 핵심 1-2장 (0) | 2024.07.19 |
---|---|
자바 객체 지향의 원리와 이해 5. SOLID (0) | 2024.05.25 |
자바 객체 지향의 원리와 이해 3. 객체 지향 (1) (0) | 2024.05.18 |
자바 객체 지향의 원리와 이해 2. 메모리 (0) | 2024.05.07 |
자바 객체 지향의 원리와 이해 1. Intro (0) | 2024.04.18 |