본문으로 바로가기

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 클래스 입니다.
    }
}