7. 캡슐화
개념 이해
객체의 데이터와 동작을 통합하여 내부 구현 세부사항을 숨기는 프로그래밍 기법입니다. 객체 상태는 제공된 메서드를 통해만 접근 및 수정 가능합니다.접근 제어 키워드
private: 클래스 내부에서만 접근 가능
public: 외부 클래스에서도 접근 가능
Getter/Setter 메서드
Getter: private 필드 값을 반환
Setter: private 필드 값을 설정
필드에 대한 접근 통제를 통해 데이터 무결성을 보장합니다.
this 키워드
현재 인스턴스 참조를 위한 키워드로 다음 용도가 있습니다:
1. 멤버 변수와 지역 변수 구분
2. 생성자 간 호출
3. 인스턴스 메서드 호출
4. 인스턴스 반환
static 키워드
클래스 수준에서 공유되는 요소를 선언합니다.
- 정적 변수: 모든 인스턴스 공유
- 정적 메서드: 클래스명으로 직접 호출 가능
- 정적 블록: 클래스 로딩 시 초기화
JAR 파일
Java 클래스 라이브러리를 패키징한 배포 형식입니다.
외부 라이브러리
third-party 라이브러리는 JAR 파일 형태로 포함되어 프로젝트에 추가됩니다.
코드 예시
// 사용자 정의 클래스
class 사람 {
// private 필드
private String 이름;
private int 나이;
// 생성자
public 사람(String 이름, int 나이) {
this.이름 = 이름;
this.나이 = 나이;
}
// Getter/Setter
public String 이름 가져오기() {
return 이름;
}
public void 이름 설정하기(String 이름) {
this.이름 = 이름;
}
public int 나이 가져오기() {
return 나이;
}
public void 나이 설정하기(int 나이) {
this.나이 = 나이;
}
// 인스턴스 메서드
public void 자기소개() {
System.out.println("안녕하세요. 제 이름은 " + this.이름 + "이고, 나이는 " + this.나이 + "세입니다.");
}
// 정적 메서드
public static void 인사() {
System.out.println("안녕하세요, 정적 메서드입니다.");
}
// 정적 블록
static {
System.out.println("정적 블록 실행 중입니다.");
}
}
// 실행 클래스
public class 실행클래스 {
public static void main(String[] args) {
// 인스턴스 생성
사람 사용자 = new 사람("김철수", 25);
// Setter 사용
사용자.이름 설정하기("박영희");
사용자.나이 설정하기(30);
System.out.println(사용자.이름 가져오기() + "님의 나이는 " + 사용자.나이 가져오기() + "세입니다.");
// 인스턴스 메서드 호출
사용자.자기소개();
// 정적 메서드 호출
사람.인사();
// 정적 자원 초기화
}
}
8. 상속
핵심 개념
기존 클래스의 속성과 메서드를 새로운 클래스에 물려주는 기법입니다. 하위 클래스는 상위 클래스의 기능을 확장하거나 재정의할 수 있습니다.장점 및 단점
장점
- 코드 재사용성 향상
- 계층적 구조 형성
- 다형성 지원
단점
- 의존성 증가
- 유지보수 어려움
- 확장 제한 (단일 상속)
Object 클래스
모든 클래스의 최상위 조상 클래스로, 다음 메서드를 제공합니다:
- equals(): 객체 비교
- hashCode(): 해시 코드 반환
- toString(): 문자열 표현
- clone(): 객체 복제
메서드 재정의
상위 클래스 메서드를 하위 클래스에서 동일한 이름으로 재구현하는 기법입니다.
재정의 규칙:
- 동일한 이름, 반환 타입, 파라미터 목록
- 접근 권한은 상위 메서드보다 넓어야 함
- 체크 예외는 상위 메서드보다 좁게 제한
super 키워드
상위 클래스의 멤버에 접근하기 위한 키워드입니다.
- 상위 클래스 필드/메서드 호출
- 생성자 호출: super() 또는 super(매개변수)
final 키워드
수정 불가능한 요소를 선언합니다.
- 클래스: 상속 금지
- 메서드: 재정의 금지
- 변수: 초기화 후 변경 금지
코드 예시
// 상위 클래스
class 동물 {
void 먹기() {
System.out.println("동물이 음식을 먹습니다.");
}
}
// 하위 클래스
class 개 extends 동물 {
@Override
void 먹기() {
System.out.println("개가 고기를 먹습니다.");
}
void 짖기() {
System.out.println("개가 짖습니다.");
}
}
public class 실행클래스 {
public static void main(String[] args) {
개 반려견 = new 개();
반려견.먹기(); // 메서드 재정의
반려견.짖기(); // 하위 클래스 고유 메서드
// super 키워드 사용
System.out.println("Object 클래스 메서드: " + 반려견.toString());
}
}