Computer Science/OOP

[OOP] 객체 지향 키워드 (추상화,캡슐화,상속,다형성)

s_y_130 2023. 4. 4. 17:25

객체 지향 프로그래밍 키워드 5가지

  • 클래스, 인스턴스, 객체
  • 추상화
  • 캡슐화
  • 상속
  • 다형성

 

1. 추상화(Abstraction)


추상화란(자료의 추상화, 추상클래스 & Interface)?

  • 우리는 보통 알고는 있지만 정확하게 표현하기 힘든 것들을 중요한 부분이나 특징점을 잡아 설명하고는 한다.
    이것을 '추상적으로 표현한다' 즉 '추상화한다' 라고 하는데 객체지향의 개념에서 추상화는 중요한 개념 중에 하나이다.

  • 컴퓨터 과학에서의 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다. 

  • 객체 지향 관점에서의 추상화는 클래스를 정의할 때, 불필요한 부분들을 생략하고 객체의 속성 중 중요한 것에만 중점을 두어 간략화 하는 것, 즉 클래스들의 중요하고 공통된 성질들을 추출하여 슈퍼 클래스를 선정하는 개념이다.

  • 자료의 추상화 = 객체지향 관점에서 클래스를 정의하는 것
  • 추상클래스 = 여러 클래스간 비슷한 필드와 메서드를 공통적으로 추출해 만들어진 클래스
  • 인터페이스 = 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것

 

추상화란, 공통된 특징을 묶어 하나의 클래스로 정의하는 것을 말한다.

예를들어, 람보르기니와 페라리 2대의 차를 보았을때 각 차에는 핸들, 바퀴, 문, 창문 등의 요소를 가지고 있는 것을 알 수 있다. 이렇게 람보르기니와 페라리는 서로 다른 객체이지만 공통된 특징과 기능을 지니고 있다. 이런 공통점을 모아 하나의 '자동차'라는 범주, 즉 '클래스'로 묶을 수 있다.

 

 

추상화 특징

  • 다중 상속이 불가능하다.
  • 추상클래스에서는 일반 메소드도 같이 사용이 가능하다.

 

 

추상 클래스(Abstract Class)

자바에서는 하나 이상의 추상 메소드를 포함하는 클래스를 가리켜 추상 클래스라고 한다. 반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 해당 추상 메소드를 반드시 재정의해야 한다. 이를 통해 각 개별 개체의 구체적인 구현에 대한 상세함을 갖출 수 있다.

 

  • 추상클래스에서는 일반 메소드도 같이 사용이 가능하다.
  • 추상클래스는 객체를 생성할 수 없다.

 

추상 메소드(Abstract Method)

자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미한다. 자바에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함이다.

 

  • abstract키워드를 메소드 앞에 붙여준다
  • 추상 메소드는 추상 클래스 안에서 선언만하고, 실질적인 메소드의 추상클래스를 상속받은 일반 자녀클래스에서 진행한다.
  • 추상메소드 뒤에 '{}'가 아닌 ';'을 붙인다.

 

추상화를 왜 하는가?

- 추상화를 통해 잘 설계했다면 여러개의 클래스를 정의했을 때, 중복 코드가 현저히 줄어들 것 이다.

-> 코드가 간결해지기 때문에 생산성 증가, 가독성 증가, 에러 감소, 유지 보수시 시간 단축 등의 효과

-> 잘 만들어진 슈퍼 클래스 덕분에 코드의 재사용성이 증가한다. 

 

추상화가 잘 되어 있는 코드는 내부 코드를 전부 이해하지 않아도 가져다가 사용할 수 있다는 장점이 있지만 반대로 그렇기 때문에 내부를 파악하거나 수정하는 것이 어려울 수 있다

 

추상화 예시

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
31
32
33
34
35
36
37
38
39
40
// 일반 클래스
class Parent1 {
    void test() {}
}
 
// 일반 클래스를 상속받은 일반 클래스
class Child1 extends Parent1{}
 
// 추상 클래스
abstract class Parent2 { 
    
    abstract void test1();
    abstract void test2();
    abstract void test3();
 
    void test99() { 
        System.out.println("일반 메서드");
    }
    
}
 
// 추상클래스를 상속받은 일반 클래스
class Child2 extends Parent2 {
 
    @Override
    void test1() {
 
    }
 
    @Override
    void test2() {
 
    }
 
    @Override
    void test3() {
 
    }
    
}
cs

 

 

 

2. 캡슐화


  • 데이터 구조와 데이터를 다루는 방법들을 결합 시켜 묶는 것 (변수와 함수를 하나로 묶는 것을 뜻함)
  • 기능과 특성의 모음을 클래스 라는 캡슐에 분류해서 넣는 것
  • 기존에는 코드에서 변수와 함수를 재활용하기에는 분산되어 있기 떄문에 재활용이 어려웠음
  • 캡슐화를 통해 관련된 기능과 특성을 한 곳에 모으고 분류하기 때문에 재활용이 원활해짐
  • 낮은 결합도를 유지할 수 있도록 설계하는 것

 

속성과 기능을 정의하는 변수와 메소드를 클래스라는 캡슐에 넣어서 분류하는 것으로 재활용이 원활하다는 장점이 있고 캡슐화를 통해서 정보은닉 을 활용 할 수도 있다. (접근제어자의 활용)

 

[getter, setter를 사용하는 이유?]
 
멤버변수에 직접 접근하지 못하게 private으로 접근지정자를 설정하고 public으로 getter, setter 메서드를 만드는 것을 많이 해왔다.
그러면서 이럴꺼면 어차피 아무나 접근가능한데 왜 private을 할까? 라고 생각했었다.
결론부터 말하면 getter, setter를 사용하면 메서드를 통해서 접근하기 때문에, 메서드 안에서 매개변수 같이 어떤 올바르지 않은 입력에 대해 사전에 처리할 수 있게 제한하거나 조절할 수 있기 때문이다.
예를들면 setter에서 유효범위를 넘은 정수가 들어왔을 때의 처리를 하고나서 set하거나 예외처리를 해버릴 수 있는 것이다.
getter도 마찬가지로 굳이 예를들자면 자료에 무언가 더하거나 빼고 준다든지가 가능하다.
 
출처: https://jeong-pro.tistory.com/95 [기본기를 쌓는 정아마추어 코딩블로그]
 

 

 

3. 상속


  • 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것
  • 적은 양의 코드로 새로운 클래스 작성 가능
  • 코드를 공통적으로 관리할 수 있어 코드의 추가 및 변경 용이

자식클래스에서 해당 기능을 다시 수정해 사용할 수 있게 하는 데서 오버라이딩(다형성)이 활용

 

4. 다형성


하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것이다.


객체 지향 프로그래밍은 하나의 클래스 내부에 같은 이름의 행위를 여러개 정의하거나 상위 클래스의 행위를 하위 클래스에서 재정의하여 사용할 수 있기 때문에 다형성이라는 특징을 갖게 된다.

 

즉 오버라이딩(Overriding), 오버로딩(Overloading)이 가능하다는 얘기다.

 

오버라이딩(Overriding)

  • 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용하는 것

오버로딩(Overloading) 

  • 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.
 

[Java]오버로딩 & 오버라이딩(Overloading & Overriding)

오버로딩(Overloading) 오버로딩(Overloading)이라는 뜻은 사전적으로 '과적하다.'라는 뜻이다. C언어에서는 함수명이 고유하게 존재해야 한다. 즉 하나의 함수가 하나의 기능만을 구현해야 한다는 것

hyoje420.tistory.com

 

 


참고

 

https://h-coding.tistory.com/36

https://velog.io/@alicesykim95/OOP-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A52-%EC%B6%94%EC%83%81%ED%99%94-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EB%8B%A4%ED%98%95%EC%84%B1-%EC%93%B0%EB%A0%88%EB%93%9C-%ED%98%95-%EB%B3%80%ED%99%98

https://sdesigner.tistory.com/90