1. 객체 지향 프로그래밍의 특징
캡슐화(Encapsulation)
- 객체의 필드, 메소드를 하나로 묶고 실제 구현 내용을 감추는 것입니다.
- 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다.
- 필드와 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하기 위해서입니다.
- 캡슐화된 멤버를 노출시킬 것인지, 숨길 것인지를 결정하기 위해 접근 제한자(Access Modifier)를 사용합니다.
- Access Modifier는 객체의 필드와 메소드의 사용 범위를 제한함으로써 외부로부터 보호합니다.
상속(Inheritance)
- 상위 객체는 자기가 가지고 있는 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 해줍니다.
- 상속은 상위 객체를 재사용해서 하위 객체를 쉽고 빠르게 설계할 수 있도록 도와줍니다.
- 객체를 재사용해서 새로운 객체를 만들기 때문에 반복된 코드를 줄여줍니다.
다형성(Polymorphism)
- 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말합니다.
- 다형성은 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해줍니다.
- 자바는 다형성을 위해 부모 클래스 또는 인터페이스의 타입 변환을 허용합니다.
- 부모 타입에는 모든 자식 객체가 대입될 수 있고, 인터페이스 타입에는 모든 구현 객체가 대입될 수 있습니다.
- 다형성의 효과로 객체는 부품화가 가능합니다.
2. 캡슐화(Encapsulation)
접근 제한자
- public > protected > default > private
- 클래스는 public과 default만 적용 가능합니다.
- 생성자, 필드, 메소드는 모든 접근 제한자 적용이 가능합니다.
3. 상속(Inheritance)
- 자바에서의 상속은 extends 키워드를 이용하여 구현합니다.
- 자바에서의 상속은 자식이 부모를 고르는 형태입니다.
- 클래스의 상속은 다중 상속이 불가능합니다.
- 인터페이스의 상속은 다중 상속이 가능합니다.
클래스의 상속
[부모 클래스 A]
public class A {
String classNameA = "A";
public void aMethod() {
System.out.println(classNameA + " 클래스의 메소드 입니다.");
}
}
[자식 클래스 B]
public class B extends A{
String classNameB = "B";
public void bMethod() {
System.out.println(classNameB + " 클래스의 메소드 입니다.");
}
}
[실행 클래스]
public class Main {
public static void main(String[] args) {
B b = new B();
System.out.println(b.classNameA); // 상속으로 인해 A 클래스의 필드 접근 가능
System.out.println(b.classNameB);
b.aMethod(); // 상속으로 인해 A 클래스의 메소드 사용 가능
b.bMethod();
}
}
인터페이스의 상속
[부모 인터페이스 A1]
public interface A1 {
void methodA1();
}
[부모 인터페이스 A2]
public interface A2 {
void methodA2();
}
[자식 인터페이스 A3]
public interface A3 extends A1, A2{
void methodA3();
}
[구현 클래스 AImpl]
A3는 A1과 A2를 다중 상속하였으므로 이에 해당하는 인터페이스의 모든 추상 메소드를 구현해야 합니다.
public class AImpl implements A3{
@Override
public void methodA1() {
System.out.println("A1");
}
@Override
public void methodA2() {
System.out.println("A2");
}
@Override
public void methodA3() {
System.out.println("A3");
}
}
4. 다형성(Polymorphism)
- 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
클래스의 다형성(추상 클래스)
[추상 클래스 A]
public abstract class A {
abstract void printClassName();
}
[추상 클래스 A의 실체 클래스 B]
public class B extends A {
@Override
void printClassName() {
System.out.println("B 클래스 입니다.");
}
}
[추상 클래스 A의 실체 클래스 C]
public class C extends A {
@Override
void printClassName() {
System.out.println("C 클래스 입니다.");
}
}
[실행 클래스]
타입은 같지만 참조하는 객체에 따라 다양한 기능을 구현합니다.
public class Main {
public static void main(String[] args) {
A a = new B(); // A 타입에 B 객체 대입
a.printClassName(); // B 클래스 입니다.
a = new C(); // ★ C 객체로 교체(대입)
a.printClassName(); // C 클래스 입니다.
}
}
인터페이스의 다형성
[인터페이스 A]
public interface A {
void printClassName();
}
[A 인터페이스의 구현 클래스 B]
public class B implements A {
@Override
public void printClassName() {
System.out.println("B 클래스 입니다.");
}
}
[A 인터페이스의 구현 클래스 C]
public class C implements A {
@Override
public void printClassName() {
System.out.println("C 클래스 입니다.");
}
}
[실행 클래스]
타입은 같지만 참조하는 객체에 따라 다양한 기능을 구현합니다.
public class Main {
public static void main(String[] args) {
A a = new B(); // A 타입에 B 객체 대입
a.printClassName(); // B 클래스 입니다.
a = new C(); // C 객체로 교체(대입)
a.printClassName(); //C 클래스 입니다.
}
}
'Backend > 객체 지향 프로그래밍' 카테고리의 다른 글
[Java] 클래스의 구성 멤버 (메소드) (0) | 2022.04.07 |
---|---|
[Java] 클래스의 구성 멤버 (생성자) (0) | 2022.04.06 |
[Java] 클래스의 구성 멤버 (필드) (0) | 2022.04.05 |
[Java] 객체와 클래스 (Object & Class) (0) | 2022.04.04 |
[Java] 객체 지향 프로그래밍 (Object Orientied Programming) (0) | 2022.04.02 |