[[ 캡슐화 ]]
캡슐화란?
캡슐화는 객체의 정보를 외부에서 직접 접근하지 못하게 보호하는 개념을 뜻한다. 캡슐화를 통해 중요한 정보를 보호하고 필요한 경우에만 안전하게 접근하게 할 수 있으며, 이는 접근제어자를 통해 구현할 수 있다.
접근제어자(Access Modifier)
그렇다면 접근제어자란 무엇일까? 이는 클래스, 변수, 메서드, 생성자의 접근 범위를 제한하는 키워드를 말한다.
| 접근제어자 | 클래스 내부 | 패키지 내부 | 상속한 클래스 | 전체 공개 |
| public | O | O | O | O |
| protected | O | O | O | X |
| default | O | O | X | X |
| private | O | X | X | X |
데이터 접근 - 게터(Getter)와 세터(Setter)
캡슐화가 잘 적용된 클래스는 내부 데이터를 private으로 보호하고 있다. 이때 데이터 조회나 변경이 필요한 경우 안전한 접근법이 필요하며 이것이 바로 게터와 세터이다.
public class Person {
private String secret;
public String getSecret() {
return this.secret; // 게터: 객체의 secret 속성 반환
}
public void setSecret(String secret) {
this.secret = secret; // 세터: secret 속성 설정 및 변경
}
}
}
[[ 상속 ]]
상속이란?
상위 클래스(부모 클래스)의 속성과 기능을 하위 클래스(자식 클래스)에게 물려주는 것을 상속이라고 한다. extends 키워드를 사용해서 상속관계를 구현할 수 있다. 이는 중복되는 코드를 줄일 수 있고 유지보수성을 높일 수 있다.
재사용성
상속의 장점은 부모 클래스의 내용을 물려받아 재사용할 수 있다.
public class Parent {
public String familyName = "Kim";
public void introduceFamily() {
System.out.println("가문 이름은 " + this.familyName + "이다");
}
}
class Child extends Parent { // extends를 활용하여 상속받음
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
System.out.println(child.familyName); // 출력: Kim (부모의 속성)
child.introduceFamily(); // 출력: 가문 이름은 Kim이다 (부모의 메서드)
}
}
super
super는 부모클래스의 멤버(변수, 메서드)에 접근할 때 사용하는 키워드입니다. 객체는 항상 부모가 먼저 생성되고 자식이 생성되어야 하므로 super()는 항상 생성자의 첫 줄에 위치해야 합니다.
public class Parent {
private String familyName = "Kim"
public Parent() {} // 부모 생성자
}
public class Child extends Parent {
private String familyName = "Lee"
public Child() {
super(); // 부모클래스 생성자를 먼저 호출
// 추가로직은 여기에 작성
}
public void superExample() {
System.out.println("현재 가문 이름은 " + this.familyName + "이다"); // 출력: ~ Lee이다.
System.out.println("원래 가문 이름은 " + super.familyName + "이다"); // 출력 : ~ Kim이다.
}
}
확장
부모클래스의 기능을 유지하면서 자식클래스에서 기능을 확장할 수 있다. 자식클래스에서 새로운 메서드를 추가 작성하는 방식이다.
public class Child extends Parent {
...
// 부모에는 없지만 자식에만 있는 기능
public void extendfunc() {
System.out.println("확장된 기능");
}
}
재정의 - 메서드 오버라이딩(overriding)
오버라이딩을 통해 부모클래스의 기능을 재정의할 수도 있다.
- 오버라이드된 메서드에는 @Override 키워드를 붙이는 것을 권장 (없어도 동작은 가능)
- 메서드 이름, 매개변수, 반환타입이 완전히 동일해야 한다.
- 접근 제어자는 부모보다 더 강한 수준으로만 변경 가능하다.
public class Parent {
public void func() {
System.out.println("기존 기능");
}
}
class Child extends Parent {
...
@Override
void func() { // 자식클래스에서 재정의
System.out.println("재정의 된 기능");
}
}
추상클래스
공통 기능을 제공하면서 하위 클래스에 특정 메서드 구현을 강제하기 위해 사용된다. 객체를 생성할 목적보다는 설계도의 역할에 적합하다. abstract 키워드를 이용하여 구현할 수 있다.
public class Parent {
abstract void fund(); // 추상메서드
}
class Child extends Parent {
...
@Override
void func() { // 자식 클래스에서 강제 구현해야한다.
System.out.println("무조건 구현해야하는 기능");
}
}
[[ 추상화 ]]
추상화란?
추상화란 불필요한 정보를 제거하고 본질적인 특징만 남기는 것을 의미한다. 객체지향 프로그래밍에서는 추상화의 계층적 특징을 활용해서 유지보수성이 좋은 프로그램을 만들 수 있습니다.
1) 인터페이스 상속을 활용한 추상 계층 표현
public interface LifeForm {
void exist();
}
public interface Animal extends LifeForm {
void makeSound();
}
public class Cat implements Animal {
@Override
public void exist() {
System.out.println("고양이");
}
@Override
public void makeSound() {
System.out.println("야옹");
}
public void scratch() {
System.out.println("스크래치");
}
}
2) 클래스 상속을 활용한 추상 계층 표현
public class LifeForm {
public void exist() {
System.out.println("존재");
}
}
public class Animal extends LifeForm {
public void makeSound() {
System.out.println("울음소리");
}
}
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("야옹");
}
public void scratch() {
System.out.println("스크래치");
}
}
[[ 다형성 ]]
다형성이란?
다형성은 하나의 타입으로 여러 객체를 다룰 수 있는 것을 뜻한다. 인터페이스를 활용해서 다형성을 구현할 수 있다.
public interface Animal {
void makeSound();
}
public class Cat implements Animal {
void makeSound() {
System.out.println("야옹");
}
}
public class Dog implements Animal {
void makeSound() {
System.out.println("멍멍");
}
}
형변환(Casting)
1) 업캐스팅(UpCasting): 자식 → 부모
public class Main {
public static void main(String[] args) {
Animal animal = new Cat(); // 자동 형 변환
animal.exist();
animal.makeSound();
// animal.scratch(); !자식클래스의 고유기능은 사용불가능!
}
}
2) 다운캐스팅(DownCasting): 부모 → 자식
public class Main {
public static void main(String[] args) {
Animal animal = new Cat();
animal.exist();
animal.makeSound();
Cat cat = (Cat) animal; // 다운캐스팅
cat.scratch(); // 자식 클래스의 기능 활용 가능
}
}'Java' 카테고리의 다른 글
| [Java] 예외와 예외 처리 (1) | 2025.04.17 |
|---|---|
| [Java] JVM 메모리 (0) | 2025.04.17 |
| [Java] 인터페이스 (0) | 2025.04.16 |
| [Java] 클래스 / 래퍼클래스 / staic / final (0) | 2025.04.15 |
| [Java] 조건문 / 반복문 / 배열 / 메서드 (0) | 2025.04.15 |