0. 복습
static
1) 멤버 변수(필드)
static이 붙은 변수 : static변수, 정적 변수, ...
static이 안붙은 변수 : 인스턴스 변수
2) 멤버 메서드
static이 붙은 메서드 : static메서드, 정적 메서드
static이 안붙은 메서드 : 인스턴스 메서드
- static이 붙은 멤버는 객체를 생성하지 않아도 사용할 수 있다
클래스명.멤버명
상속
: 기존에 선언된 클래스(부모 클래스)의 멤버를 다른 클래스(자식 클래스)에게 물려주고 싶을 때 사용
1) 상속 문법
class 자식클래스명 extends 부모클래스명{
// 부모 클래스의 멤버를 상속받음
// 자식 클래스에서 추가할 멤버
}
2) 자바의 상속
- 자바에서는 오직 하나의 클래스에서만 상속받을 수 있다(단일 상속)
- 모호성 문제를 방지하기 위해 단일 상속만 지우너
super
: 상속 관계에서 부모의 멤버에 접근할 때 사용
super()
: 자식 클래스 생성자 내부에서 부모의 생성자를 호출
오버라이딩 : 재정의
- 부모에게 상속받은 메서드를 새롭게 재정의 하는 것
1. 접근 제한자(Access Modifier)
: 클래스, 변수, 메서드, 생성자의 = 접근 범위를 제한하는 키워드
1) 자바의 접근 제한자
(1) public
- 어디서든 접근 가능(다른 패키지에서도 접근 가능)
- 클래스에 사용할 경우 대표 클래스를 의미
- 가장 개방적
(2) protected
- 같은 패키지 내에서만 접근 가능
- 단, 자식 클래스는 패키지가 달라도 접근 가능
(3) default
- 접근 제한자를 생략하면 default 라고 함(default를 명시하는게 아님 !!)
- 같은 패키지 내에서만 접근 가능
(4) private
- 같은 클래스 내부에서만 접근 가능
- 외부에서는 접근 불가능
- 가장 폐쇄적
2) private과 getter, setter
: private을 사용하면 외부에서 필드에 직접 접근하는 것을 허용하지 않는다
이를 우회하여 사용하기 위해 getter와 setter를 활용한다
3) private를 사용하는 이유
(1) 필드에 직접 접근하면 이상한 값이 들어갈 수 있지만,
getter, setter 같은 메서드를 활용하면 값을 검사할 수 있다
(2) getter와 setter를 상황에 따라 제외시킬 수 있다
- setter를 만들지 않으면 데이터가 변경될 수 없게 만들 수 있다
- getter를 만들지 않으면 내부의 중요한 데이터를 숨길 수 있다
4) 필드 직접 접근을 막으면 좋은 이유
- 직접 접근으로 값을 변경하면 유효한(정상적인) 값인지 판단하기 불편하다
setter는 메서드이므로 값이 유효한지 검사하는 코드를 추가할 수 있다
- getter를 의도적으로 만들지 않으면 중요한 값을 외부로부터 감출 수 있다 (은닉화)
- setter를 의도적으로 만들지 않으면 객체가 가진 값을 변경할 수 없도록 만들 수 있다 (불변성)
** 무조건 필드를 privat으로 만들고 getter/setter를 사용하라는 의미가 아님, 상황에 맞게 선택하면 된다
2. Casting(캐스팅)
Java의 형변환(Casting)
: 자바의 형변환은 크게 2가지가 존재한다
(1) 기본 타입 캐스팅(자동 형변환/강제 형변환)
(2) 참조 타입 캐스팅
참조 타입 캐스팅
- A타입 객체를 B타입으로 변환하는 것
- 일반적으로 불가능하지만 두 클래스가 상속관계인 경우 가능하다
- 즉, 참조 타입 캐스팅은 부모/자식 관계인 경우만 가능 !!
1) 참조 타입 캐스팅의 종류
(1) 업캐스팅(Upcasting)
: 자식 클래스 객체를 부모 타입으로 변환
(2) 다운캐스팅(Downcasting)
: 부모 타입 객체를 자식 타입으로 변환
이미 업캐스팅 된 객체를 다시 자신의 타입으로 되돌리는 것 !!!
2) 캐스팅 주의사항
- 자식 클래스에서 재정의를 한 메서드는 업캐스팅 후에도 자식 클래스의 메서드가 호출됨
- 자식 클래스에서 새로 추가한 메서드는 업캐스팅 후 사용할 수 없음
=> 사용하고 싶다면 다시 다운캐스팅
3) instanceof 연산자(키워드인데 연산자의 역할을 함)
- 객체의 타입을 확인하는 연산자
- a instanceof A : a변수가 가리키는 객체가 A클래스의 객체야?
- 결과는 true/false 로 나온다 => 조건식으로 사용 가능
** 자식 객체의 타입
: 자식 객체는 부모의 타입도 동시에 갖는다(타입이 여러개)
** 다형성
: 하나의 것이 여러 형태를 가질 수 있는 성질
- 다형성을 구현하는 대표적인 방법
(1) 메서드 오버로딩
(2) 메서드 오버라이딩
(3) 참조변수의 다형성 : 부모타입의 참조변수로 자식 객체를 가리킬 수 있다(업캐스팅)
4) 캐스팅을 사용하는 이유
- 공통 부모 타입으로 여러 타입의 객체를 받을 수 있으므로
코드의 중복이 줄어들고 재사용성이 높아진다
(코드의 중복 방지와 재사용성 증가)
- 만약 캐스팅을 사용하지 않으면 같은 기능의 메서드를 매개변수 타입별로 여러번 만들어야 하는데 나중에 해당 기능을 수정할 때 하나의 메서드만 수정하는 것이 아니라 타입별로 모두 수정해야하므로 유지보수에 불리해진다 (유지 보수성 증가)
- 새로운 기능을 추가하더라도 공통 타입을 상속받으면 기존의 코드를 수정하지 않아도 되며 기능 확장이 편리해진다 (기존 코드 수정 방지와 확장성 증가)