반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

Yeonee's Story

[취업/면접] OOP란? (캡슐화, 추상화, 다형성, 상속성) 본문

。*:・゚☆・゚schedule・゚*:・゚★・:*:・☆ *:・゚★/나의 면접 준비 자료 ✿˘◡˘✿

[취업/면접] OOP란? (캡슐화, 추상화, 다형성, 상속성)

yeonee 여니 2023. 10. 3. 22:02
728x90
반응형
SMALL

안녕하세요.
https://blog.naver.com/sysysy0302 여니입니다 :)

 

개발자라면 '객체 지향 프로그래밍'이라는 단어를 많이, 그것도 아주 자주 들어보셨을텐데요,
오늘은 이 '객체 지향 프로그래밍'이 무엇인지, 'OOP'라는 이 단어는 무엇인지에 대해 알아보겠습니다.

 

OOP 개념

OOP란 (Object-Oriented Programming)의 약자로, 객체의 관점에서 프로그래밍을 한다는 것으로 객체 지향 프로그래밍 언어를 뜻합니다. 

OOP는 객체를 기준으로 코드를 나누어 구현합니다. 자바의 경우 그 구성 부분의 단위가 클래스입니다. 
클래스는 설계도이고 직접 일을 하는 구현체는 인스턴스입니다.  좀 더 자세히 말하자면  부품에 해당하는 객체들을 먼저 만들고 이것들을 하나씩 조립, 연결하여 전체 프로그램을 완성하는 기법이라고 할 수 있습니다.

자바 프로그래밍하면 객체지향프로그래밍 OOP이라 해도 무방합니다.

 

OOP 특징

💊 캡슐화 (Encapsulation)

하나의 객체에 대해 그 객체가 특정한 목적을 위해 필요한 변수나 메소드를 하나로 묶는 것을 의미합니다.
따라서 클래스를 우리가 만들 때 훗날 이 클래스에서 만들어진 객체가 특정한 목적을 잘 수행 할 수있도록 사용해야할 변수와 그 변수를 가지고 특정한 액션 즉 메서드를 관련성 있게 클래스에 구성해야 합니다.

정보은닉

캡슐화를 하는 중요한 목적은 바로 정보은닉입니다. 유저 정보를 가지고 있는 user라는 객체에서 유저의 정보가 public르로 선언되어 있다면 누구든지 정보에 접근해서 유저 정보를 변경할 수 있기 때문에 접근제한자를 private로 데이터를 보호해서 접근을 제한해야합니다.

이렇게 보호된 변수는 getter나 setter 등의 메서드를 통해서만 간접적으로 접근이 가능하도록 하는 것이 캡슐화의 중요한 목적입니다. 

🤔 참고로 캡슐화와 정보은닉은 동일한 개념이 아닙니다. 캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에 정보은닉을 할 수 있다는 특징이 있는 것입니다.

ex) 오르골을 사용할 때 오르골의 내부 작동원리(private으로 정의된 속성)을 알 필요가 없다는  것입니다. 사용자의 입장에서는 오르골의 조작 기능, 즉 public으로 정의된 속성만 알면 된다는 것입니다.

 

🗃️ 추상화 (Abstraction)

추상화는 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념입니다.
즉, 세상에 존재하는 것을 본따 클래스를 만들고 그 클래스의 상태와 행동을 부여한 객체를 만듭니다.
그러나 세상에 모든 것을 다 클래스에 담고 객체로 만드는 것은 불가능합니다. 그래서 추상적으로 생각하여 일단 큰 틀의 클래스를 구현하고 그 클래스에 최소한의 이러한 공통적인 요소나 필수적인 요소는 들어갔으면 좋겠다는 바램에서 만든 것이 '추상클래스'입니다.

인터페이스와 추상클래스
공통적인 요소나 특징을 추출하는 과정이 추상화인 것이 됩니다.

ex) 우리가 알고있는 벤츠, 아우디, 제네시스 등 다양한 자동차 종류가 있습니다. 이것을 다 클래스화하고 변수와 메서드를 개별적으로 만드는 것은 무모한 짓이며(즉, 확장성 때문에 추상화할 필요가 있습니다.), 자동차들의 공통적인 요소나 특징을 추출하는 과정인 추상화를 거쳐 요소를 꺼내면 바퀴, 핸들, 유리창 등이 필수적인 부품이 됩니다.
그리고 바퀴는 굴러가고 핸들은 돌아가야한다 등 공통적인 행동 즉 어떤 차든 필수적으로 필요한 메서드가 추출됩니다. 이러한 과정이 추상화하는 과정이며, 추상적으로 꺼내어 낸 개념들을 큰 틀에서 클래스로 만든 것이 '추상클래스'입니다.

객체와 클래스의 관점에서 다시 정리해보면, 객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념입니다. 즉, 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이라고 할 수 있습니다.

 

🖇️ 다형성 (Polymorphism)

다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해줍니다. 즉, 다형성은 형태가 같은데 다른 기능을 하는 것을 의미합니다. (같은 동작이지만 다른 결과물이 나올때 다형이라고 생각할 수 있습니다.) 이를 통해 코드의 재사용, 코드 길이 감소가 되어 유지보수가 용이하도록 도와줍니다.

ex) 고양이 클래스에 '울음'이라는 속성이 정의되어 있습니다. 사자는 고양이 과이기 때문에 사자 클래스는 고양이 클래스를 상속 받는다고 하면,  사자 클래스에도 '울음'이라는 속성이 자동으로 추가됩니다. 이것을 '상속'이라고 합니다.
하지만, 고양이와 사자의 울음소리는 다릅니다.(즉, '다른 울음소리'가 '다른 결과물'이 됩니다.) 같은 '울음' 속성임에도 실제 울음소리는 다른 이런 것을 '다형성'이라고 말할 수 있습니다.

오버라이딩(Overloading)  & 오버로딩(Overriding) 
OOP에서 다형성의 개념을 녹여내는 방법은 두가지로, 바로 오버라이딩(Overloading)과 오버로딩(Overriding) 입니다.

[ 오버라이딩 ]
부모클래스에서 상속받은 자식클래스에서 부모클래스에서 만들어진 메서드를 자식클래스에서 자신의 입맛대로 다시 재정의해서 사용하는 것을 말합니다.

[ 오버로딩 ]
같은 이름의 메서드를 사용하지만 메서드마다 다른 용도로 사용되며 그 결과물도 다르게 구현할 수 있게 만드는 개념입니다.
🌟중요🌟
- 오버로딩이 가능하려면 메서드끼리 이름은 같지만 매개변수의 갯수나 데이터 타입이 다르면 오버로딩이 적용됩니다.
- 메서드 이름이 같아도 문법 에러 X


[ 오버라이딩과 오버로딩 사용 예시 ]

// Overriding

public class Employee{
  
  public String name;
  public int age;
  
  public void print(){
    System.out.println("사원의 이름 = "+this.name+", 나이 = "+this.age);
  }
}

//Emplyee 상속
public class Manager extends Employee{
  
  String jobOfManage;
  
  //overriding  Employee의 pirnt() 메소드 오버라이딩
  public void print(){
    System.out.println("사원의 이름 = "+this.name+", 나이 = "+this.age);
    System.out.println("관리자 "+this.name+"은 "+this.jobOfManage+" 담당입니다.");
  }
}

//Overloading
public class OverloadingTest{
  
  public void test(){
    System.out.println("사용자 없음");
  }
  
  public void test(String name){
    System.out.println("사용자 이름 = " +name);
  }
  
  public void test(String name, int money){
    System.out.println("사용자 이름 = "+name+" , 사용료 = "+money);
  }
}

같은 행위를 하지만 용도와 목적에 부합하여 다양한 기능을 수행하고 처리하여 다양한 결과를 도출할 수 있습니다.

다형성을 사용하면 좋은점

같은 이름의 속성을 유지함으로써, 속성을 사용하기 위한 인터페이스를 유지하고, 메서드 이름을 낭비하지 않는다는 것입니다. 

ex) 고양이와 사자의 울음소리를 호출하기 위해 각 객체에서 roar()메서드를 호출하면 됩니다. 굳이 roarCat(), roarLion()으로 각각을 정의할 필요가 없이 공통된 roar()메서드 하나로 다른 값(고양이 울음소리, 사자 울음소리)을 도출할 수있다는 것입니다. API가 많아질수록 복잡성이 증가하기 때문에 다양성은 유용하게 사용됩니다.

 

💾 상속성, 재사용 (Inheritance)

상속은 객체지향의 꽃이라고 할 수 있습니다.

- 상속이란 기존 상위클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념입니다.
- 기존 클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어 줍니다.

자바에서는 상속은 단일 상속 밖에 지원이 되지 않습니다.
이 때문에 대비책으로 인터페이스를 다중 상속(구현) 할 수 있게 해서 다중 상속에 대한 대책을 만들어주었답니다. 그러나 인터페이스의 존재이유가 다중상속을 지원하기 위함이다 라고 생각하면 안됩니다!

일반적으로 부모로부터 재산 등을 물려받는 것을 상속이라고 칭하는 개념을 OOP에서도 동일한 개념으로 사용합니다.  OOP에서는 이를 부모클래스, 자식클래스로 표현합니다.

ex) 고양이클래스와 강아지클래스가 있습니다. 고양이와 강아지 모두 동물에 해당합니다. 동물은 여러 속성들이 정의되어 있는데 고양이와 강아지는 동물의 이런 속성을 갖고 있습니다. 하지만 아주 많은 속성이 다르기 때문에 더 디테일하게 고양이, 강아지로 나눈 것 뿐입니다. 즉, 동물이라는 클래스는 고양이와 강아지 클래스에 속성들을 물려줍니다. 이것을 상속이라고 하고, 동물클래스와 고양이클래스, 동물클래스와 강아지클래스는 상속 관계에 있다고 합니다.

상속이 필요한 이유(장점)

상속이 필요한 이유는 코드의 중복을 제거하기 위함입니다.
코드의 중복이 많아지면 개발 단계에서도 피곤하지만, 유지보수 측면에서도 많은 비용과 노력이 들게 되기 때문입니다. 그래서 개발을 할 때 코드의 중복은 반드시 피해야합니다. OOP에서는 상속을 통해 코드의 중복 문제를 일부 해결할 수 있습니다.

ex) 상속이 필요한 이유를 이해하고 위의 예시를 다시 살펴보면, 동물클래스에 여러 속성들을 정의해놓고 동물에 해당하는 생명체, 예시로 살펴보았던 고양이클래스나 강아지클래스가 필요한 경우 동물클래스와 상속 관계를 맺습니다.
상속 관계를 맺으면서 자식 객체를 생성할 때 부모클래스의 속성들을 자동으로 물려 받기 때문에 자식클래스에서 이러한 속성들을 또 정의할 필요가 없어집니다.  즉, 코드의 중복을 제거할 수 있습니다.

상속의 단점

굳이 단점이라고 하자면 상속받은 부모클래스를 변형 시 자식 클래스도 동일하게 변형되어 개별적으로 수정이 불가능하다는 점입니다. 

 

+ 참조 사이트

 

728x90
반응형
LIST