본문 바로가기

CS

[객체지향 프로그래밍] 객체지향

클래스와 오브젝트, 인스턴스

정의

  • 클래스 (Class): 객체를 정의하기 위한 설계도나 틀
    • 클래스는 객체의 상태(속성)와 동작(메소드)을 정의
    • 예를 들어, Car 클래스는 자동차의 속성(예: 색상, 모델)과 동작(예: 가속, 제동)을 포함함
  • 오브젝트 (Object): 객체는 클래스로부터 생성된 구체적인 실체
    • 클래스가 설계도라면 객체는 그 설계도로부터 만들어진 실제 제품
    • 예를 들어, Car 클래스의 객체는 특정 색상과 모델을 가진 실제 자동차이다.
  • 인스턴스 (Instance): 인스턴스는 객체와 동일한 의미로 사용되며, 특정 클래스의 실제 예시
    • Car 클래스의 인스턴스는 특정한 속성 값을 가진 자동차 객체를 의미

 

상속과 다형성

상속 (Inheritance)

  • 정의: 상속은 기존 클래스(부모 클래스)의 속성과 메소드를 새로운 클래스(자식 클래스)가 물려받는 기능
    • Animal 클래스를 상속받은 Dog 클래스는 Animal 클래스의 속성과 메소드를 모두 사용할 수 있음
    • 필요에 따라 새로운 메소드를 추가하거나 기존 메소드를 재정의(오버라이딩)할 수 있음

다형성 (Polymorphism)

  • 정의: 다형성은 하나의 인터페이스나 부모 클래스를 통해 다양한 형태의 객체를 다룰 수 있는 능력을 의미
    • 주로 메소드 오버로딩(같은 이름의 메소드가 여러 가지 형태를 가질 수 있음)과 오버라이딩(부모 클래스의 메소드를 자식 클래스에서 재정의)을 통해 구현됨
    • Shape 클래스의 자식 클래스들인 Circle과 Square는 각각의 draw() 메소드를 가지고 있다. 다형성을 통해 Shape 타입의 변수로 Circle과 Square 객체를 모두 참조할 수 있으며, 적절한 draw() 메소드가 호출된다.

Class와 Prototype의 공통점과 차이점

공통점

  • 둘 다 객체 지향 프로그래밍에서 객체를 생성하고 속성과 메소드를 정의하는 방법
  • 객체의 행동과 상태를 정의하고, 이를 기반으로 실제 객체를 만들 수 있음

차이점

  • Class
    • 대부분의 현대 언어(Java, C#, Python 등)에서 사용
    • 클래스를 정의하고 이를 통해 객체를 생성
  • Prototype
    • JavaScript에서 사용되는 방식
    • 객체가 다른 객체를 프로토타입으로 삼아 상속을 받음
    • JavaScript에서의 객체는 프로토타입 체인에 의해 다른 객체의 속성과 메소드를 상속받을 수 있음

 

this와 super 키워드 차이점

this 키워드

  • 정의: this는 현재 객체를 참조하는 키워드. 객체의 속성과 메소드를 참조하거나 호출할 때 사용됨

super 키워드

  • 정의: super는 부모 클래스의 속성이나 메소드에 접근하기 위해 사용된다. 주로 상속 관계에서 부모 클래스의 생성자나 메소드를 호출할 때 사용됨
  • 예시: 자식 클래스의 생성자 내에서 super()를 호출하면 부모 클래스의 생성자가 호출된다. 또한 super.methodName()을 통해 부모 클래스의 메소드를 호출 가능

객체 인스턴스 비교하는 다양한 방법과 효율성

비교 방법

  1. 참조 비교 (Reference Comparison): 두 객체가 같은 메모리 주소를 가리키는지 확인.
    • 자바에서는 == 연산자를 사용하여 객체의 참조를 비교한다.
    • 자바스크립트에서 == 연산자 혹은 === 연산자로 확인, 두 객체의 참조가 다를경우 false값 출력
    • 효율성: 빠르지만, 동일한 내용을 가지는 두 객체가 다른 메모리 주소에 있을 경우 같은 객체로 인식하지 않음
  2. 값 비교 (Value Comparison): 객체의 내용(속성 값)을 비교
    • 자바에서는 equals() 메소드를 오버라이딩하여 값을 비교할 수 있다.
    • 효율성: 내용이 동일한지를 정확하게 비교할 수 있지만, 객체의 모든 속성을 비교해야 하므로 참조 비교보다 느림
  3. 해시 코드 비교 (Hash Code Comparison): 객체의 해시 코드를 비교
    • 자바에서는 hashCode() 메소드를 오버라이딩하여 사용
    • 효율성: 해시 코드 비교는 일반적으로 빠르지만, 해시 충돌이 발생할 수 있으므로 값 비교와 함께 사용해야 함

효율성 비교

  • 참조 비교: 메모리 주소만 비교하므로 가장 빠름 but, 실제 객체의 내용이 동일한지를 확인할 수 없음
  • 값 비교: 객체의 내용을 정확하게 비교할 수 있음 but, 속성이 많을 경우 성능이 저하됨
  • 해시 코드 비교: 빠르게 비교할 수 있음 but, 충돌 가능성이 있어 신뢰성이 떨어질 수 있고 보통 값 비교와 함께 사용함

객체지향 설계원칙 (SOLID)

  • 단일 책임 원칙(SRP) : 한 클래스는 하나의 책임만을 가져야함
  • 개방 폐쇄 원칙(OCP) : 확장에는 열려 있고, 수정에는 닫혀있음
  • 리스코프 치환 원칙(LSP) : 리스코프, 자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있어야 함
  • 인터페이스 분리 원칙(ISP) : 자신이 사용하지 않는 인터페이스는 구현하지 말아야함
  • 의존성 역전 원칙(DIP) : 의존 관계를 맺을 때 자주 변화하는 것보다, 변화가 거의 없는것에 의존해야 함

'CS' 카테고리의 다른 글

DBMS, SQL, 트랜잭션  (0) 2024.08.05
Git에 대한 모든 것  (0) 2024.07.31
URL  (0) 2024.07.23
[컴파일러] 파싱(parsing)  (0) 2024.07.17
[Linux] SSH  (0) 2024.07.16