728x90

들어가며


안녕하세요,

Spring 프레임워크와 관련해 시리즈로 글을 쓰기로 마음을 먹었는데,, 사실 인프런의 김영한 선생님 커리큘럼을 수강중이라 수강 후기에 가까울 것 같습니다. ㅎㅎ

이전 글에서는 대표적인 용어 개념을 정리한 것 같은데 이번 글에서는  객체 지향 프로그래밍의 개념에 대해 정리를 하려고 합니다. 

 

 

처음 자바 스프링을 공부한다면?Java Spring 프레임워크의 기본

백엔드 개발자를 선택하고 나서 개발자에게 프론트는 js, 백은 Java를 선택해야(?)만 할정도로 한국 사회에서 가장 널리 보급되고 있는 것 같다. 프론트 백엔드 웹 html, css, js (React, Next) Java, Java Spri

wooltech.tistory.com

 

 

객체 지향 = 다형성?


객체 지향 프로그래밍의 정의는 위키백과에 따르면, 아래와 같다.

더보기

객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

객체 지향 프로그래밍은 프로그램을 유연하고 변경이 쉽게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점이 있다. 그러나 지나친 프로그램의 객체화 경향은 실제 세계의 모습을 그대로 반영하지 못한다는 비판을 받기도 한다.

또한, 자바 언어 설명서에 의하면 객체는 클래스 인스턴스 또는 배열로 정의된다.

An object is a class instance or an array.

 

 

처음 들었을 때는 객체, 클래스, 인스턴스 등 이해되지 않는 말들 투성이였다.

그렇지만 개발자 = 창조자(god)에 비유하면 이해를 도울 수 있으리라 생각한다. 자, 우리는 어플리케이션이라는 세상을 창조하려고 한다. 세상을 구성하고 기능하게 하기 위해서는 피조물(객체)가 필요하다.

 

객체는 추상적, 구체적 정의로 나뉜다. 아래 그림을 예로 들면, K3, 아반떼, 모델3는 모두 자동차면서도 서로 구분이 된다. 여기서 자동차는 추상적 정의다. 우리의 머리 속에만 존재하는 개념.

 

A : 나 '자동차' 살거야.

B : 어떤 자동차?

A : K3!

 

A와 B는 모두 자동차에 대해 이야기를 하고 있지만, 실제로 사용하기 위해서는 '어떤 자동차'라는 구체적인 정의가 필요하다.

다형성은 자동차라는 클래스를 수만가지의 종류를 구현할 수 있음을 의미한다.

프로그래밍 관점에서 클라이언트가 '자동차를 타고 싶어'라고 요청을 보냈다면 K3를 타다가 아반떼를 타고 그리고 모델3로 바꿔 타도 문제가 없다.

 

인터페이스와 상속


그래서 자동차는 단순히 공통분모로 정의되는 개념일까? 

우리가 머리 속에 자동차를 떠올릴 때 생각나는 형태가 있을 것이다. 그 특징들의 차이로 K3, 아반떼, 모델3를 구분할 수 있다. 이 특징들은 매우 중요하고 이를 추상 메서드라고 한다.

추상 메서드는 추상 클래스와 인터페이스를 통해 상속되는 개념인데, 클래스는 하나의 추상 메서드만을 상속하지만, 인터페이스는 여러 개의 추상 메서드를 상속할 수 있다.

 

다만, 추상 메서드는 강제로 하위 클래스에서 구현되기 때문에 안정적인 설계가 중요하다.

글솜씨가 부족해 제대로 전달이 될 지 우려된다...

더보기
  1. 하위 클래스에서의 강제 구현: 추상 메서드는 하위 클래스에서 반드시 구현되어야 하는 메서드입니다. 추상 클래스나 인터페이스에 있는 추상 메서드를 상속받은 클래스는 해당 메서드를 반드시 구현해야 합니다. 이를 통해 특정한 동작이나 기능을 하위 클래스에서 강제할 수 있습니다.
  2. 다형성 구현: 추상 메서드는 다형성(polymorphism)을 구현하는데 사용됩니다. 여러 하위 클래스가 같은 추상 메서드를 각각의 방식으로 구현함으로써, 이들 객체를 동일한 추상 타입으로 다룰 수 있습니다.
  3. 클래스 설계의 기본 틀 제공: 추상 클래스에서는 구현이 필요한 메서드를 제공하면서 동시에 기본적인 구조나 틀을 제공할 수 있습니다. 이를 상속받은 하위 클래스는 이러한 틀을 기반으로 추가적인 동작을 정의할 수 있습니다.

예를 들어, 동물을 나타내는 추상 클래스가 makeSound라는 추상 메서드를 가지고 있을 때, 이를 상속받은 구체적인 동물 클래스에서는 각 동물의 소리를 구현할 수 있습니다. 이로써 동물의 다양성을 표현하고 공통된 특징을 추상 클래스에서 제공할 수 있습니다.

*동물을 키워드로 아래 코드를 보면 이해가 쉬울 것이라 생각한다.

// 동물을 나타내는 인터페이스
interface Animal {
    void makeSound(); // 추상 메서드: 동물의 울음 소리를 나타냄
}

// 각 동물을 구현하는 클래스
class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("멍멍!"); // 강아지는 멍멍 짖음
    }
}

class Cat implements Animal {
    @Override
    public void makeSound() {
        System.out.println("야옹!"); // 고양이는 야옹 소리
    }
}

class Duck implements Animal {
    @Override
    public void makeSound() {
        System.out.println("꽥꽥!"); // 오리는 꽥꽥 소리
    }
}

public class AnimalExample {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();
        Animal duck = new Duck();

        dog.makeSound(); // 멍멍!
        cat.makeSound(); // 야옹!
        duck.makeSound(); // 꽥꽥!
    }
}

 

인터페이스의 다중 구현


FlyingFish는 Fly와 Swim 두가지 추상 메서드를 상속 받는다.

// 인터페이스 정의
interface Flyable {
    void fly();
}

interface Swimmable {
    void swim();
}

// 클래스가 두 인터페이스를 다중으로 구현
class FlyingFish implements Flyable, Swimmable {
    @Override
    public void fly() {
        System.out.println("Flying in the air!");
    }

    @Override
    public void swim() {
        System.out.println("Swimming in the water!");
    }
}

public class Main {
    public static void main(String[] args) {
        FlyingFish flyingFish = new FlyingFish();
        flyingFish.fly();  // Flying in the air!
        flyingFish.swim(); // Swimming in the water!
    }
}

 

 

 

 

+ Recent posts