객체 지향 프로그래밍의 4가지 특징

HOSEON YOO·2023년 12월 29일
1

개요

인프런 김영한 강사님의 스프링 강의에서도 나오고 개발자 면접 단골 질문이기도 한 객체 지향 프로그래밍의 4가지 특징에 대해 다시 한번 복습해보려고 한다.

추상화(Abstration)

추상화는 "객체의 공통적인 상태와 행위를 추출하여 정의하는 것"을 의미한다. 객체 지향 프로그래밍에서는 보다 유연하고 변경에 열려있는 프로그램을 설계하기 위해 역할과 구현을 분리하는데, 여기서 역할에 해당하는 부분이 추상화될 수 있다.

위의 사진을 보면, 동물들은 울음이라는 공통적인 행위를 가진다. 그리고 상태로는 나이, 다리 개수 등을 가질 수 있다.

코드 구현

// 동물
public abstract class Animal {
    int age;

    abstract void cry();
}

// 강아지
public class Dog extends Animal {
    @Override
    void cry() {
        System.out.println("멍멍");
    }
}

// 고양이
public class Cat extends Animal {
    @Override
    void cry() {
        System.out.println("야옹");
    }
}

상속

상속은 "부모 객체의 상태와 행위를 자식 객체가 물려받아서 사용할 수 있는 것"을 의미한다. 클래스들 간 공유하는 상태와 행위들을 반복적으로 정의할 필요 없이 딱 한 번만 정의해두고 간편하게 재사용할 수 있어 반복적인 코드를 최소화시켜 준다.

위의 사진을 보면, CarMotorBike 클래스의 공통적인 부분들을 추출하여 부모 Vehicle 클래스를 만든다.

코드 구현

// 탈것
public class Vehicle {
	String model;
    String color;
    int wheels;
    
    void moveForward() {
    	System.out.println("전진합니다.");
    }
    void moveForward() {
   		System.out.println("전진합니다.");
    }
}

// 자동차
public class car extends Vehicle {
	boolean isConvertible;
    
	void openWindow() {
    	System.out.println("창문을 엽니다.");
    }
}

// 오토바이
public class MotorBike extends Vehicle {
	boolean isRaceable;
    
	void stunt() {
    	System.out.println("묘기를 부립니다.");
    }
}

다형성

다형성은 "사용법은 동일하지만 실행 결과가 다양하게 나오는 성질"을 말한다. 다형성을 활용하면 하나의 타입만으로 여러 가지 타입의 객체를 참조할 수 있어 간편하고 유연하게 코드를 작성하는 것이 가능해진다.

위의 사진을 보면, 자동차에 어떤 타이어를 장착하느냐에 따라서 주행 성능이 달라진다.

코드 구현

// 타이어
public class Tire {
	void roll() {
    	System.out.println("타이어가 회전합니다.");
    }
}

// 한국타이어
public class HankookTire extends Tire {
	@Override
	void roll() {
    	System.out.println("한국 타이어가 회전합니다.");
    }
}

// 금호타이어
public class KumhoTire extends Tire {
	@Override
	void roll() {
    	System.out.println("금호 타이어가 회전합니다.");
    }
}

// 자동차
public class Car {
	Tire tire;
}

캡슐화

캡슐화는 "객체의 상태와 행위를 하나로 묶고 실제 구현 내용을 외부에 감추는 것"을 말한다. 상태와 행위를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는 데 있다. 자바는 캡슐화된 멤버를 노출시킬 것이지 숨길 것인지를 결정하기 위해 접근 제한자를 사용한다.

아래의 코드를 확인해보면, Member 클래스의 name 은 확인할 수 있지만 idpwd 는 확인할 수 없다.

코드 구현

public class Member {
	private String id;
    private String pwd;
    private String name;
    
    public String getName() {
    	return name;
    }
}

참고자료

profile
안녕하세요~ 👋, 대한민국 개발자 유호선입니다.

0개의 댓글