[DEV] study&learn
article thumbnail
Published 2022. 11. 11. 16:46
[TIL 항해 5일 차] 카테고리 없음
컴퓨터랑 일하는 건 엄청 멋있다.
누구랑 싸우지도 않고, 모든 것을 대신 기억해주고,
내 맥주를 뺏어 마시지도 않는다.(Paul Leary)

❓ 어제의 내가 궁금해한 것

다형성?

다형성(polymorphism)이란 부모-자식 상속 관계에 있는 클래스에서

상위 클래스가 동일한 메세지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리이다.

다형성을 활용하면 부모 클래스가 자식 클래스의 동작 방식을 알 수 없어도 오버라이딩을 통해 자식 클래스에 접근할 수 있다.

 

다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다.

자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있다.

다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나이다.

 

클래스, 객체, 인스턴스

클래스(Class) 란

  • 개념

객체를 만들어 내기 위한 설계도 혹은 틀

연관되어 있는 변수와 메서드의 집합

 

객체(Object) 란

  • 개념

소프트웨어 세계에 구현할 대상

클래스에 선언한 모양 그대로 생성된 실체

  • 특징

'클래스의 인스턴스(instance)'라고도 부른다.

객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.

OOP의 관점에서 클래스의 타입으로 선언되었을 때 '객체'라고 부른다.

 

인스턴스(Instance) 란

  • 개념

설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체

즉, 객체를 소프트웨어에 실체화 하면 그것을 '인스턴스'라고 부른다.

실체화된 인스턴스는 메모리에 할당된다.

  • 특징

인스턴스는 객체에 포함된다고 볼 수 있다.

OOP의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다.

인스턴스는 어떤 원본(추상적인 개념)으로부터 '생성된 복제본'을 의미한다.

 

클래스 VS 객체

클래스는 설계도, 객체는 설계도로 구현한 모든 대상을 의미한다.

객체 VS 인스턴스

클래스의 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.

객체는 현실 세계에 가깝고, 인스턴스는 소프트웨어 세계에 가깝다.

객체는 실체에 초점을 맞추고, 인스턴스는 관계에 초점을 맞춘다.

 

‘방금 인스턴스화하여 레퍼런스를 할당한’ 객체를 인스턴스라고 말하지만,

이는 원본(추상적인 개념)으로부터 생성되었다는 것에 의미를 부여하는 것일 뿐 엄격하게 객체와 인스턴스를 나누긴 어렵다.

 

추상 클래스와 인터페이스

클래스는 크게 일반 클래스와 추상 클래스로 나뉜다.

여기서 추상 클래스

  1. 클래스 내 '추상 메소드'가 하나 이상 포함되거나
  2. abstract로 정의된 경우를 말한다.

반면 인터페이스는 모든 메소드가 추상 메소드인 경우이다.

 

두 개념의 차이는 명확하다. 생김새도 다르고, 사용하는 방법도 다르다.

하지만 하는 일은 비슷하다.

 

추상클 클래스와 인터페이스는 상속받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메소드를 구현하도록 강제한다.

 

하는 일이 비슷한데 왜 인터페이스와 추상 클래스를 구분지어 놓았을까?

결론부터 말하자면 존재의 목적이 다르다.

추상 클래스는 그 추상 클래스를 상속받아서 기능을 이용하고, 확장시키는데 존재의 목적이 있다.

반면, 인터페이스는 함수의 껍데기만 있는데, 그 이유는 그 함수의 구현을 강제하기 위해서이다. 구현을 강제함으로써 구현 객체의 같은 동작을 보장할 수 있게 된다.

 

추상 클래스와 추상 메서드에 관하여

"추상"의 사전적 의미 : 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용.

 

추상화 : 클래스간의 공통점을 찾아내서 공통의 부모를 설계하는 작업

구체화 : 상속을 통해 클래스를 설계, 확장하는 작업

 

 

[Java-자바]추상 클래스 및 추상 메서드(abstract class and abstract method)

추상메서드란 "추상" 사전적 의미로 "여러가지 사물이나 개념에 공통되는 특성이나 속성따위를 추출하여 파악하는 작용"이라는 의미이다. 추상화 : 클래스간의 공통점을 찾아내서 공통의 부모

sungwoon.tistory.com

 

상속

빠르고, 유지보수가 쉽고, 중복이 적고, 통일성 있는 프로그램으 만들기 위해서.

 

상속(inheritance)란?

  • 기존 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미한다.
    이러한 상속은 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나이다.
    상속을 이용하면 기존에 정의되어 있는 클래스의 모든 필드와 메소드를 물려받아, 새로운 클래스를 생성할 수 있다.
    이때 기존에 정의되어 있던 클래스를 부모 클래스(parent class) 또는 상위 클래스(super class), 기초 클래스(base class) 라고도 한다.
    그리고 상속을 통해 새롭게 작성되는 클래스를 자식 클래스(child class) 또는 하위 클래스(sub class), 파생 클래스(derived class)라고도 한다.
  • 우리가 생각하는 상속이라는 단어가 맞으며, 현실에서 부모님이 자식들에게 재산을 물려주는 것과 비슷하다.
    차이점은 자식(클래스)이 상속받고 싶은 부모(클래스)를 선택해서 물려받는다.

<점프 투 자바>

class Animal {
	String name;
    
    void setName(String name) {
    	this.name = name;
    }
}

class Dog extends Animal {
	void sleep() {
    	System.out.println(this.name+" zzz");
    }
}

public class Sample {
	public static void main(String[] args) {
    	Dog dog = new dog();
        dog.setName("poppy");
        System.out.println(dog.name); // poppy 출력
        dog.sleep(); // poppy zzz 출력
    }
}

클래스 상속을 위해서는 extends 라는 키워드를 사용한다.

 

이제 Dog 클래스는 Animal 클래스를 상속하게 되었고, Dog 클래스에 name 이라는 객체변수와 setName 이라는 메소드를 만들지 않았지만 Animal 클래스를 상속했기 때문에 그대로 사용이 가능하다.

 

또한 Dog가 sleep 메소드를 자체적으로 가지고 있는데, 이렇듯 부모 클래스를 상속받은 자식 클래스는 부모 클래스의 기능에 더하여 좀 더 많은 기능을 갖도록 작성한다.

 

IS-A 관계

 

Dog 클래스는 Animal 클래스를 상속했다. 즉, Dog는 Animal의 하위 개념이라고 할 수 있다.

"Dog is a Animal"과 같이 말할 수 있는 관계를 자바에서는 IS-A 관계라고 한다.

IS-A 관계(상속 관계)에 있을 때, 자식 클래스의 객체는 부모 클래스의 자료형인 것처럼 사용할 수 있다.

(반대로 부모 클래스의 객체를 자식 클래스의 자료형인 것처럼은 사용할 수 없다.)

 

 

아래의 예제 2개를 봐보자.

// 예제1
Animal dog = new Dog(); // Dog is a Animal (O)
/* 
※ 다만 여기서 한 가지 주의해야 할 점이 있다.
Dog객체를 Animal 자료형으로 사용할 경우에는 
Dog 클래스에만 존재하는 sleep 메소드를 사용할 수 없다는 점이다.
이런 경우에는 Animal 클래스에 구현된 setName 메소드만 사용이 가능하다.
*/

// 예제2
Dong dog = new Animal(); // Animal is a Dog (X)

예제1의 코드를 읽어보면 "개로 만든 객체는 동물 자료형이다." 라고 읽을 수 있다.

 

예제2의 코드를 읽어보면 "동물로 만든 객체는 개의 자료형이다." 라고 읽을 수 있다.

 

여기서 예제2는 조금 어색하지 않은가?

동물로 만든 객체는 "개"자료형 말고 "고양이"자료형 또는 "코끼리" 자료형도 될 수 있지 않은가?

 

개념적으로도 이론적으로도 예제2의 코드는 성립할 수 없다.

profile

[DEV] study&learn

@devjuni

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!