클래스와 오브젝트, 인스턴스
정의
- 클래스 (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()을 통해 부모 클래스의 메소드를 호출 가능
객체 인스턴스 비교하는 다양한 방법과 효율성
비교 방법
- 참조 비교 (Reference Comparison): 두 객체가 같은 메모리 주소를 가리키는지 확인.
- 자바에서는 == 연산자를 사용하여 객체의 참조를 비교한다.
- 자바스크립트에서 == 연산자 혹은 === 연산자로 확인, 두 객체의 참조가 다를경우 false값 출력
- 효율성: 빠르지만, 동일한 내용을 가지는 두 객체가 다른 메모리 주소에 있을 경우 같은 객체로 인식하지 않음
- 값 비교 (Value Comparison): 객체의 내용(속성 값)을 비교
- 자바에서는 equals() 메소드를 오버라이딩하여 값을 비교할 수 있다.
- 효율성: 내용이 동일한지를 정확하게 비교할 수 있지만, 객체의 모든 속성을 비교해야 하므로 참조 비교보다 느림
- 해시 코드 비교 (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 |