1. 상속
객체지향 언어의 특징
OOP is A.P.I.E
특성 | 내용 |
---|---|
Abstraction(추상화) | 현실의 객체를 추상화 해서 클래스를 구성한다. |
Polymorphism(다형성) | 하나의 객체를 여러 가지 타입으로 참조할 수 있다. |
Inheritance(상속) | 부모 클래스의 자산을 물려받아 자식을 정의함으로 코드의 재사용이 가능하다 |
Encapsulation(데이터 은닉과 보호) | 데이터를 외부에 직접 노출시키지 않고 메소드를 이용해 보호할 수 있다. |
상속(Inhritance: Java Is A PIE)
기존 클래스의 자산(멤버)을 자식 클래스에서 재사용하기 위한 것
부모의 생성자와 초기화 블록은 상속하지 않는다
기존 클래스의 멤버를 물려 받기 때문에 코드의 절감
부모의 코드를 변경하면 모든 자식들에게도 적용 → 유지 보수성 향상
상속의 적용
extends 키워드 사용
Object 클래스
모든 클래스의 조상 클래스
별도의 extends 선언이 없는 클래스들은 extends Object가 생략됨
따라서 모든 클래스에는 Object 클래스에 정의된 메서드가 있음
단일 상속
자바는 단일 상속만 지원
대신 interface와 포함 관계(has a)로 단점 극복
포함 관계
상속 이외의 클래스에서 재활용 하는 방법
2개 이상의 클래스에서 특성을 가져올 때 하나는 상속, 나머지는 멤버 변수로 처리
메서드 오버라이딩(Overriding)
조상 클래스에 정의된 메서드를 자식 클래스에서 적합하게 수정하는 것
조건
메서드 이름이 같아야 한다.
매개변수의 개수 타입 순서가 같아야 한다.
리턴 타입이 같아야 한다.
접근 제한자는 부모 보다 범위가 넓거나 같아야 한다.
조상보다 더 큰 예외를 던질 수 없다.
Annotaion
컴파일러, JVM, 프레임워크 등이 보는 주석
@Deprecated
컴파일러에게 해다 메서드가 deprecated 되었다고 알려줌
@Override
컴파일러에게 해당 메서드는 override한 메서드 임을 알려줌
반드시 super class에 선언되어있는 메서드여야 함
@SupperessWarnings
컴파일러에게 사소한 warning의 경우 신경 쓰지 말라고 알려줌
equals 메서드
== 연산자
두 객체의 주소 값 비교
.equals 메서드
객체의 내용을 비교할 수 있도록 equals 메서드 재정의
hashCode
객체의 해시 코드 : 시스템에서 객체를 구별하기 위해 사용되는 정수 값
HashSet, HashMap 등에서 객체의 동일성을 확인하기 위해 사용
equals 메서드를 재정의 할 때는 반드시 hashCode도 재정의 할 것
class Product {
String sn;
public Product(String sn) {
this.sn = sn;
}
@Override
public boolean equals(Object obj) {
if(obj != null && obj instanceof Product) {
Product casted = (Product) obj;
return sn.equals(casted.sm);
}
return false;
}
@Override
Public String toString() {
return "Product [sn =" + sn + "]";
@Override
public int hashCode() {
return sn.hashCode();
}
}
super 키워드
this를 통해 멤버에 접근했듯이 super를 통해 조상 클래스 멤버 접근
this()가 해당 클래스의 다른 생성자를 호출하듯 super()는 조상 클래스의 생성자 호출
조상클래스에 선언된 멤버들은 조상 클래스의 생성자에서 초기화가 이뤄지므로 이를 재활용
자식 클래스에 선언된 멤버들만 자식 클래스 생성자에서 초기화
super()는 자식 클래스 생성자의 맨 첫 줄에서만 호출 가능
즉 생성자의 첫 줄에만 this() 또는 super()가 올 수 있다.
명시적으로 this() 또는 super()를 호출하지 않는 경우 컴파일러가 super() 삽입
결론적으로 맨 상위의 Object까지 객체가 다 만들어지는 구조
2. package와 import
Package
프로그램의 많은 클래스 → 패키지 이용
패키지의 이름은 의미 있는 이름으로 만들고 .를 통해 계층적 접근
물리적으로 패키지는 클래스 파일을 담고 있는 디렉터리
package의 선언
package package_name;
주석, 공백을 제외한 첫 번째 문장에 하나의 패키지만 선언
모든 클래스는 반드시 하나의 패키지에 속한다.
일반적인 package name 룰
소속.프로젝트.용도
ex) com.ssafy.hrm.common
import
다른 패키지에 선언된 클래스를 사용하기 위한 키워드
패키지와 클래스 선언 사이에 위치
패키지와 달리 여러 번 선언 가능
선언 방법
import 패키지명.클래스명;
import 패키지명.*;
import 한 package의 클래스 이름이 동일하여 명확히 구분해야 할 때
클래스 이름 앞에 전체 패키지 명을 입력
java.util.List list = new java.util.ArrayList();
default import package
// 선언해주지 않아도 자동으로 선언 됨
import java.lang.*;
3. 제한자(modifier)
클래스, 변수, 메서드 선언부에 함께 사용되어 부가적인 의미 부여
종류
- 접근 제한자: public, protectied, default(package), private
- 그 외 제한자
- static: 클래스 레벨의 요소 설정
- final: 요소를 더 이상 수정할 수 없게 함
- abstract: 추상 메서드 및 추상 클래스 작성
- synchronized: 멀티스레드에서의 동기화 처리
하나의 대상에 여러 제한자를 조합 가능하나 접근 제한자는 하나만 사용 가능
순서는 무관
일반적으로 접근제한자를 맨 앞으로
final
마지막, 더 이상 바뀔 수 없음
용도
- final class - 더 이상 확장 할 수 없음: 상속 금지→ 오버라이드 방지
- final method - 더 이상 재 정의 할 수 없음: 오버로딩 금지
- final variable - 더 이상 값을 바꿀 수 없음: 상수화
접근제한자
멤버 등에 사용되며 해당 요소를 외부에서 사용할 수 있는지 설정
method override 조건의 확인
부모의 제한자 범위와 같거나 넓은 범위로만 사용 가능
4. 데이터 은닉과 보호(Encapsulation)
정보가 보호되지 못하는 이유
외부에서 변수에 직접 접근하기 때문
대책
변수는 private 접근으로 막기
공개되는 메소드를 통한 접근 통로 마련: setter/getter
Singleton design pattern
외부에서 생성자에 접근 금지 → 생성자의 접근 제한자를 private로 설정
내부에서는 private에 접근 가능하므로 직접 객체 생성 → 멤버 변수이므로 private 설정
외부에서 private member에 접근 가능한 getter 생성 → setter는 불필요
객체 없이 외부에서 접근할 수 있도록 getter와 변수에 static 추가
외부에서는 언제나 getter를 통해서 객체를 참조하므로 하나의 객체 재사용
5. 다형성(Polymorphism)
다형성의 정의
상속 관계에 있을 때 조상클래스의 타입으로 자식 클래스 객체를 레퍼런스 할 수 있다.
'JAVA > 객체지향프로그래밍' 카테고리의 다른 글
Collection Framework (0) | 2021.12.06 |
---|---|
Exception Handling (0) | 2021.12.06 |
OOP - 3 (0) | 2021.12.06 |
OOP - 1 (0) | 2021.12.06 |