객체지향 프로그래밍3 - 다형성, 추상화

김소희·2023년 2월 28일
1

샤워할때마다 유튜브를 틀어놓고 씻는 버릇이 있다.
내 유튜브 홈에는 성공에 관한 영상들이 주를 이루는데 '0.1%를 위한 성공 세미나', '조셉 머피 잠재 의식의 힘', '저절로 노력하게 되는 비밀' 같은 이름의 영상들이 추천된다.
오늘 들은 내용은 데니스웨이틀리의 강연으로 성공의 정답이 태도와 관점에 있다는 내용이였다.
자존감이란 내면 깊숙이 '나의 가치'를 느끼는 것인데
자신에 대한 느낌이 내면을 만들기 때문에 가장 중요하다고 했다.
영상을 듣다보면 성공이 코 앞에서 날 기다리는 것처럼 느껴지는 고양된 기분을 느낄 수 있는데, 오늘은 어제와 전혀 다른 새로운 하루라는 것이 실감나고 기대감이 생겨난다.


<다형성>

다형성이란 양한 태를 가질 수 있는 질을 의미한다.
자바에서의 다형성은 하위클래스가 상위클래스로 동작하게 만드는 테크닉으로
한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것이다.
이를 활용하면 1개의 참조변수로 여러가지의 결과 값이 나오도록 할 수 있다.

class Friend {
    public void friendInfo() {
        System.out.println("나는 당신의 친구입니다.");
    }
}

class BoyFriend extends Friend {
   
    public void friendInfo() {
        System.out.println("나는 당신의 남자친구입니다.");
    }
}

class GirlFriend extends Friend {
    
    public void friendInfo() {
        System.out.println("나는 당신의 여자친구입니다.");
    }
}

public class FriendTest {

    public static void main(String[] args) {
        Friend friend = new Friend(); // 객체 타입과 참조변수 타입의 일치
        BoyFriend boyfriend = new BoyFriend();
        Friend girlfriend = new GirlFriend(); // 객체 타입과 참조변수 타입의 불일치

        friend.friendInfo();
        boyfriend.friendInfo();
        girlfriend.friendInfo();
    }
}

// 출력값
나는 당신의 친구입니다.
나는 당신의 남자친구입니다.
나는 당신의 여자친구입니다.

위 코드를 보면 GirlFriend 클래스의 인스턴스를 Friend 타입의 참조변수 girlfriend에 할당하고 있다. 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조하는 것을 볼 수 있다.
이 경우 GirlFriend가 사용할 수 있는 맴버의 개수가 적어지지만 하나의 인스턴스로 묶어서 관리 할 수 있는 이점이 있다.

<추상화>

추상화란 클래스들의 공통적인 요소들을 뽑아서 상위 클래스로 만드는 것이다.
추상화 시키는 방법은 abstract제어자를 사용하거나 인터페이스를 사용하면 된다.
추상화를 사용하면 코드의 재사용성, 가독성을 높이고, 생산성의 증가, 에러 감소, 유지 보수에 있어 많은 시간을 줄일 수 있다.

abstract 제어자

1. abstract method = 추상메소드
추상 메소드는 메소드 시그니쳐만 있고 바디는 없는 미완성 메소드이다.
추상 메소드를 사용하면 하위클래스들은 각각 상황에 맞는 메소드를 구현할 수 있는 이점이 있다.
추상 메소드가 있으면 상속받는 클래스들은 해당 메소드의 바디를 완성시켜야 객체를 생성할 수 있으므로 구현을 강제시키고 싶을 때 사용하면 된다.

2. abstract class = 추상클래스
추상 메소드가 있는 클래스는 자동으로 추상 클래스가 된다.
클래스가 추상으로 선언되면 인스턴스화할 수 없습니다.
단일 상속만 가능하다.

final 제어자

추상의 반대의 경우로 상속을 막고, 변수 수정을 막고, 오버로딩을 막고싶다면 final 제어자를 쓰면 된다.
1. final 지역변수 = 변수의 값은 상수가 되어 변하지 않는다.
2. final class = 클래스를 확장하거나 상속받을 수 없게 한다.
3. final method = 오버라이딩이 불가능해진다.

인터페이스 (interface)

인터페이스란 서로 다른 두 시스템, 장치, 소프트웨어 따위를 서로 이어주는 접속 장치를 말한다.
상속만을 위해서 사용되기 때문에 추상 메서드와 상수만을 멤버로 가질 수 있다.(추상 클래스는 일반 메소드도 포함할 수 있다.)

인터페이스는 다중 구현(↔ 단일상속)이 가능하다.
실무에서는 다중 구현이 가능한 이점때문에 추상클래스보다 인터페이스가 더 자주 쓰인다고 한다.

일반 클래스와 다르게, 내부의 모든 필드가 public static final로 정의되고, 앞서 간단하게 언급한 static과 default 메서드 이외의 모든 메서드가 public abstract로 정의된다.
생략 가능한 부분은 실행시 컴파일러가 자동으로 추가한다.

인터페이스의 정의 예시
public interface InterfaceEx {             // 인터페이스 선언
    public static final int rock = 1;      // 인터페이스 인스턴스 변수 정의
    public static final int scissors = 2;  // public static 생략가능
    public static final int paper = 3;     // public & final 생략가능

    public abstract String getPlayingNum();
    public abstract void call();           // public abstract 생략 불가
}


인터페이스의 구현
class Dog implements Animal, Pet {   // Animal과 Pet 인터페이스 다중 구현
    public void cry(){               // 메서드 오버라이딩
        System.out.println("멍멍!"); 
    }
}

간혹 특정 클래스는 다른 클래스로부터의 상속을 받으면서 동시에 인터페이스를 구현할 수 있다.

profile
백엔드 개발자 소희의 모험

0개의 댓글