코코아 Study_캡상추다#4

VANS·2021년 12월 17일
0

스터디

목록 보기
4/15

21.12.17(금)


캡상추다 : 객체 지향의 4대 특성

캡 : 캡슐화(Encapsulation) : 정보은닉
상 : 상속(Inheritance) : 재사용
추 : 추상화(Abstraction) : 모델링
다 : 다형성(Polymorphism) : 사용편의


1. 캡슐화 - 정보은닉


  • protected는 상속 관계에 있는 서브클래스 뿐만 아니라, 같은 패키지 내의 클래스에서도 접근이
    가능하다.
  • 상속을 받지 않았다면 객체 멤버는 객체를 생성한 후 객체 참조 변수를 이용해 접근해야 한다.
    (일관된 형식으로 접근하기 위해서)
  • 정적 멤버는 클래스명.정적멤버 형식으로 접근하는 것을 권장한다.
    (일관된 형식으로 접근하고, 메모리의 물리적 접근에 따른 이유도 있다.)

2. 상속 - 재사용

  • 객체 지향에서의 상속은 상위 클래스의 특성을 하위 클래스에서 상속하고, 추가적으로 필요한 특성을
    확장해서 사용할 수 있다는 의미
  • 객체 지향의 상속은 부모-자식 같은 계층도나 조직도가 아닌 동물 - 포유류 같은 분류도이다.

<동물>

package inheritance;
 
public class Animal {
    String group;
 
    Animal() {
        group = "동물";
    }
 
    void showMe() {
        System.out.println(group);
    }
 
}

<포유류>

package inheritance;
 
public class Mammal extends Animal {
    public Mammal() {
        group = "포유류";
    }
}

<고래>

package inheritance;
 
public class Whale extends Mammal {
    public Whale() {
        group = "고래";
    }
 
}
  • 객체 지향의 상속은 상위 클래스의 특성을 재사용하는 것이다.
  • 객체 지향의 상속은 상위 클래스의 특성을 확장하는것이다.
  • 객체 지향의 상속은 is a kind of 관계를 만족해야 한다.
  • 상속관계 표현 : kind of

    포유류 is a kind of 동물 : 포유류는 동물의 한 분류이다.
    고래 is a kind of 포유류 : 고래는 포유류의 한 분류이다.


3. 추상화 - 모델링

  • 객체에서 공통된 속성과 행동을 추출하는것
  • 추상화를 이용하는 방법에는 추상 클래스와 인터페이스가 있다.

추상 클래스(Abstract Class)

  • 추상 메소드를 포함할 수 있는 클래스로, 부모로서 사용은 가능하지만 객체로서의 사용은 불가하다.

추상 메소드(Abstract Method)

  • 내용(본체)이 없는 메소드이다. 리턴 타입 앞에 'abstract'를 붙여 사용할 수 있다.
  • 추상메소드의 내용(본체)은 추상 클래스를 상속 받은 후 재정의할 수 있다.
abstract class Animal{ // 추상클래스
    public abstract void eat(); //추상 메소드
    public abstract void sleep(); //추상 메소드
    public int bite(){ // 메소드
        System.out.println("물었다!");
        return 0;
    }
}
class Dog extends Animal{ // Animal를 상속받은 Dog
    @Override
    public void eat(){
        System.out.println("개가 먹는다");
    }
    @Override
    public void sleep(){
        System.out.println("개가 잔다");
    }
}
public class abstractTest{
    public static void main(String[] args) {
        Dog obj = new Dog();
        obj.eat(); // 개가 먹는다
        obj.sleep(); // 개가 잔다
        obj.bite(); // 물었다!

        // Animal obj2 = new Animal(); // error
    }
}

Animal 클래스는 eat과 sleep 추상 메소드를 포함하기 때문에 추상 클래스이다.
Dog 클래스는 추상 클래스 Animal을 상속 받고 있다.
Dog 클래스에서 추상 메소드 eat과 sleep을 재정의 하고 있다.

  • 메인에서 Dog 클래스의 eat과 sleep은 사용 가능하다.
  • 메인에서 Animal 클래스의 eat과 sleep은 사용 불가능하다.(추상 메소드라서)

인터페이스(Interface)

  • 추상 메소드만을 가질 수 있고, 인터페이스를 상속 받는 클래스에서는 반드시 인터페이스 안의
    메소드를 모두 구현해야한다.
  • 주로 인터페이스를 구현한 객체들에 대해 동일한 동작을 약속하기 위해 사용됨.
interface Animal{ // 인터페이스
    public abstract void eat(); //추상 메소드
    public abstract void sleep(); //추상 메소드
}

class Dog implements Animal{ // A를 상속받은 B
    @Override
    public void eat(){
        System.out.println("개가 먹는다");
    }
    @Override
    public void sleep(){
        System.out.println("개가 잔다");
    }
}
public class interfaceTest{
    public static void main(String[] args) {
        Dog obj = new Dog();
        obj.eat(); // 개가 먹는다
        obj.sleep(); // 개가 잔다

        // Animal obj2 = new Animal(); // error
    }
}

인터페이스를 사용하기 위해서는 인터페이스 이름 앞에 'interface'를 추가한다.
인터페이스를 상속 받을 때에는 'extends' 대신 'implemnts'를 사용한다.

추상 클래스와 인터페이스의 차이점

  • 메소드의 유형
    추상 클래스 : 추상 메소드(선택) + 일반 메소드
    인터페이스 : All 추상 메소드
  • 변수의 final의 여부
    추상 클래스 : X
    인터페이스 : 기본적으로 final을 붙임
  • 클래스인가?
    추상 클래스 : O
    인터페이스 : X
  • 목적
    추상 클래스 : 상속 받아 기능을 확장해나감
    인터페이스 : 구현 객체의 같은 동작 보장
  • 다중 상속
    추상 클래스 : 불가능
    인터페이스 : 가능

4. 다형성 - 사용편의

  • 객체지향에서의 다형성은 오버라이딩(Overriding), 오버로딩(Overloading) 2가지라 할 수 있다.
  • 사용하는 이유는 코드의 재사용성이 높아져 유지보수가 쉬워진다.
  • 오버라이딩 : 같은 메서드 이름, 같은 인자 목록으로 상위 클래스의 메서드를 재정의
  • 오버로딩 : 같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를 중복 정의

오버라이딩(Overridng)

  • 부모 클래스를 상속받은 자식 클래스에서 부모 클래스를 새롭게 정의할 수 있다.
  • 상위 클래스 타입의 객체 참조 변수에서 하위 클래스가 오버라이딩한 메소드를 자동으로 호출해줘서
    깔끔한 코드를 유지할 수 있게 된다.
class Parents{ 
    public void info(){
        System.out.println("부모 클래스 입니다.");
    }

}

class Child extends Parents{
    public void info() {
        super.info();
        System.out.println("자식 클래스 입니다.");
    }
}

public class OverTest {
    public static void main(String[] args) {

        Child son = new Child();
        son.info(); // "자식 클래스 입니다."

    }
}

오버로딩(Overloading)

  • 하나의 클래스에서 같은 이름의 메소드를 가질 수 있게 한다.(인자는 달라야 함)
class OverloadingTest{
    //이름이 cat인 메서드
    void cat(){
        System.out.println("매개변수 없음");
    }
    
    //매개변수 int형이 2개인 cat 메서드
    void cat(int a, int b){
        System.out.println("매개변수 :"+a+", "+b);
    }
    
    //매개변수 String형이 한 개인 cat 메서드
    void cat(String c){
        System.out.println("매개변수 : "+ c);
    }
    
}
 
public class OverTest {
 
    public static void main(String[] args) {
        
        //OverloadingTest 객체 생성
        OverloadingTest ot = new OverloadingTest();
        
        //매개변수가 없는 cat() 호출
        ot.cat();
        
        //매개변수가 int형 두개인 cat() 호출
        ot.cat(20, 80);
        
        //매개변수가 String 한개인 cat() 호출
        ot.cat("오버로딩 예제입니다.");
        
    }
 
}
profile
코딩도 점진적 과부화

0개의 댓글