Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

To Dare Is To Do!

[java]객체 지향 프로그래밍이란? 본문

Java

[java]객체 지향 프로그래밍이란?

Nick_Choi 2023. 10. 20. 07:39

누군가 객체 지향 프로그래밍에 대해 설명해달라고 한다면 "객체들로 구성된 파일들이 유기적으로 작용하여 효율적으로 프로그램을 유지, 보수할 수 있는 방식이다" 정도의 얕은 설명만 할 수 있을 뿐 대표적인 4가지 특징에 대해 명확하게 떠오르지 않았다.

 

 이번 기회를 통해 객체 지향의 특징에 대해 이해하고 넘어갈 수 있도록 정리해 보고자 한다.

 

객체 지향의 4가지 특징

1. 추상화 (Abstration)

중요하고 필요한 정보만을 표현하기 위하여 객체의 공통된 속성과 기능을 파악하여 정의하는 것

 

 자바에서는 추상 클래스와 인터페이스를 통해 추상화를 구현할 수 있으며 다음은 인터페이스를 사용한 예시이다.

 

public interface Machine {
    public abstract void turnOn();
    public abstract void turnOff();
    void changeChannel(); // public abstract 생략 가능
}

 

public class Tv implements Machine{

    @Override
    public void turnOn(){
    	System.out.println("tv 전원이 켜집니다!");
    }

    @Override
    public void turnOff(){
    	System.out.println("tv 전원이 꺼집니다!");
    }
 }

 

public class Radio implements Machine{

    @Override
    public void turnOn(){
    	System.out.println("라디오 전원이 켜집니다!");
    }

    @Override
    public void turnOff(){
    	System.out.println("라디오 전원이 꺼집니다!");
    }
 }

객체 지향적 측면에서 인터페이스 어떠한 객체의 핵심적인 역할만을 정의하여 객체들 간의 관계를 원활하게 연결하는 역할을 담당한다.

 

위의 예시 속 Tv와 Radio는 전원을 켜고 끄는 공통된 특징이 객체의 핵심적인 역할로서 추출되어 Machine 인터페이스에 정의되었다.

 

이러한 추상화를 통해 유연하고 변경이 용이한 프로그램을 설계하는데 기여할 수 있다.

 

2. 상속 (Inheritance)

기존(상위)의 클래스가 가지고 있는 특징을 재활용하여 새로운(하위) 클래스를 작성하는 것

상위 클래스의 특징을 공유함으로써 반복적인 코드를 최소화하며 추후 코드를 수정할 때 상위 클래스에 대한 수정만으로 모든 클래스에 변경 사항을 적용시킬 수 있어 유지 및 보수에 용이하다.

 

예시 코드

public class Machine{

    String color;
    String maker;
    int price;
    
    void turnOn() {
     System.out.println("전원이 켜집니다.");
    }
    
    void turnOff(){
    System.out.println("전원이 꺼집니다.");
    }
}

 

public class Tv extends Machine {
    boolean isOled;
}

 

public class Radio extends Machine {
    boolean hasDisplay;

    @Override
    void turnOn() {
    	System.out.println("라디오 전원이 켜집니다.");
    }
}

 

public class Main {
    public static void main(String[] args) {
    
    Tv tv = new Tv();
    Radio radio = new Radio();
    
    tv.color = "실버";
    tv.maker = "LG";
    
    System.out.println("우리 집 TV는" + tv.maker + "의 " + tv.color + "색 TV 입니다.");
    
    tv.turnOn();
    radio.turnOn();
    radio.turnOff();
    
  }
}

 

// 출력값
우리 집 TV는 LG의 실버색 TV 입니다.
전원이 켜집니다.
라디오 전원이 켜집니다.
전원이 꺼집니다.

 

3. 다형성 (Polymorphism)

어떠한 객체의 특징이 해당 맥락에 맞게 역할을 수행할 수 있도록 다양한 헝태로서 표현되는 것

대표적인 예로는 메서드의 오버라이딩과 오버로딩이 있다.

public interface Machine {
    public abstract void turnOn();
    public abstract void turnOff();
    void changeChannel(); // public abstract 생략 가능
}

 

public class Tv implements Machine{

    @Override
    public void turnOn(){
    	System.out.println("tv 전원이 켜집니다!");
    }

    @Override
    public void turnOff(){
    	System.out.println("tv 전원이 꺼집니다!");
    }
 }

위의 예시는 turnOn()과 turnOff()를 Tv 클래스에서 오버라이딩하여 맥락에 맞는 역할을 수행하도록 한다.

 

하지만 객체 지향의 맥락에서 위의 내용보다 더 중요한 것은 하나의 타입으로 여러 객체를 사용할 수 있다는 다형성의 정의이다.

public interface Machine {
	void turnOn();
    void turnOff();
}

public class Tv implements Machine {
	@Override
    public void turnOn() {
    	System.out.println("TV를 켭니다.");
    }
    
    @Override
    public void turnOff() {
    	System.out.println("TV를 끕니다.");
    }
}

public class Radio implements Machine {
	@Override
    public void turnOn() {
    	System.out.println("Radio를 켭니다.");
    }
    
    @Override
    public void turnOff() {
    	System.out.println("Radio를 끕니다.");
    }
}

public Class Person {
	void use(Machine machine)	{
    machine.turnOn();
    machine.turnOff();
	}
}

public class Main {
	public static void main(String[] args) {
        Tv tv = new Tv();
        Radio radio = new Radio();
        Person person = new Person();

        person.use(tv);
        person.use(radio);
  	}
}

// 출력값
TV를 켭니다.
TV를 끕니다.
Radio를 켭니다.
Radio를 끕니다.

 

4. 캡슐화 (Encapsulation)

클래스 속 서로 관련 있는 특징들을 하나의 캡슐로 만들어 모으 외부로부터 데이터를 보호하는 것

자바에서 캡슐화를 구현하기 위해서는 접근제어자를 활용하거나 getter/setter 메서드를 사용하는 방법이 있다.

 

먼저 접근제어자에는 4가지 종류가 있다.

 

1. public : 어떤 클래스든 접근할 수 있다는 것을 의미

2. protected : 자기 자신, 같은 패키지, 서로 다른 패키지여도 상속받은 자식 클래스에서는 접근 가능

3. default : 자기 자신과 같은 패키지에서만 접근 가능

4. private : 자기 자신만 접근 가능

 

멤버 변수의 경우 private으로 외부 접근을 제한하고  getter / setter 메서드를 만들어 내부 데이터에 대한 접근을 허용한다.

getter : 외부에서 변수에 대한 데이터를 읽을 때 사용

setter : 외부에서 변수에 대한 데이터를 쓸 때 사용

 

public class food {

	private String recipe;
    
    public String getRecipe() {
    	return recipe;
    }
    
    public void setRecipe(String recipe) {
        this.recipe = recipe;
    }

 


참고

https://www.codestates.com/blog/content/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8A%B9%EC%A7%95