seaking110 님의 블로그
객체지향 프로그래밍 이란? 본문
객체지향 프로그램이란?
객체란?
- 세상에 존재하는 물체, 식별이 가능한 것
- 속성과 행위로 구성
- 속성 : 필드
- 행위 : 메서드
- EX ) 자동차
- 속성 : 회사, 모델, 색상, 가격, 속도
- 행위 : 가속 브레이크, 기어변속, 조명, 경적
- 객체 간의 관계 종류
- 사용 관계
- 사람이 자동차를 사용한다
- 포함 관계
- 자동차에는 문이 포함된다
- 상속 관계
- 기계 시스템에는 차와 오토바이 등이 포함된다.
- 사용 관계
객체지향 프로그래밍의 특징
- 캡술화(encapsulation)
- 속성 (필드)와 행위(메서드)를 하나로 묶어 객체로 만든 후 내부 구현 내용은 외부에서 알 수 없게 감추는 것
- 보안상으로 훌륭
- 외부 객체에서 잘 못 사용하여 객체가 변화하지 않게 할 수 있다.
- 접근 제어자를 이용해 노출 시킬지 감출 지 결정 가능
- 상속 ( inheritance)
- 부모 객체가 가지고 있는 필드와 메서드를 자식 객체가 이를 사용
- 상속을 함으로써 객체 간의 구조를 파악하기 쉽고 코드의 재사용성이 증가
- 다형성 ( Polymorphism )
- 객체가 연산을 수행할 때 하나의 행위에 대해 각 객체가 가지고 있는 고유한 특성에 따라 다른 여러가지 형태로 재구성 되는 것을 의미
- 추상화 ( Abstraction )
- 객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것
- 모델링 하는 것!
클래스를 만들기 위한 4가지 순서
- 클래스 선언
- 속성 정의
- 생성자 정의
- 메서드 정의
클래스를 인스턴스화 시켜야 사용이 가능하다!
메서드 오버로딩
- 하나의 메서드 이름으로 여러 기능을 구현하도록 하는 기능
- 한 클래스 내에 같은 이름의 메서드라도 매개변수의 개수 또는 타입 또는 순서가 다르면 동일한 이름을 사용해서 메서드를 구현 할 수 있다.
- 메서드 이름을 절약할 수 있다.
- 메서드 이름 하나로 상황에 따른 동작을 개별로 정의할 수 있다.
- 기본형 매개변수는 값 자체가 복사되어 넘어가기 때문에 매개값으로 지정된 변수의 원본 값이 변경되지 않는다.
- 참조형 매개변수는 값의 주소가 복사되어 넘어가기 때문에 변수의 원본 값이 변경된다.
클래스 멤버
- 객체 생성 없이도 사용할 수 있는 멤버 EX) main 메서드
- 클래스 로더에 의해 메서드 영역에 저장되고 사용
- static 키워드를 사용
- 메모리를 효율적으로 사용 가능
생성자
- 객체를 생성할 때 호출되며 객체를 초기화하는 역할
- 오버로딩을 적용하여 효율적으로 처리 가능
this 와 this()
- this 키워드를 통해 변수명에 해당하는 객체의 필드에 접근하여 받아온 매개변수의 매개값을 객체의 필드값에 대입하여 저장 가능
- 객체의 메서드에서 리턴 타입이 인스턴스 자신의 클래스 타입이라면 this를 사용하여 인스턴스 자신의 주소를 반환 가능
- this에 괄호가 있다면?
- 생성자의 오버로딩을 할 때 상당히 코드의 중복이 발생 할 수 있음
- this 키워드를 이용해서 코드의 중복을 없애며 간단하게 코드를 짤 수 있다
this 사용전
public Car(String model) {
this.model = model;
this.color = "Blue";
this.price = 50000000;
}
public Car(String model, String color) {
this.model = model;
this.color = color;
this.price = 50000000;
}
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
this 사용 후
public Car(String model) {
this(model, "Blue", 50000000);
}
public Car(String model, String color) {
this(model, color, 100000000);
}
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
- 주의점 : this() 키워드는 반드시 생성자의 첫 줄에 작성되어야한다!
접근 제어자
- public : 접근 제한 x
- protected : 같은 패키지 내에서, 다른 패키지의 자손 클래스에서 접근 가능
- default : 같은 패키지 내
- private : 같은 클래스 내
Getter와 Setter
- 직접적인 값의 조회 및 세팅 방지!
- 외부에서 객체의 private 한 필드를 읽을 때 Getter 메서드 사용
- 외부에서 객체의 private 한 필드를 저장/수정할 필요가 있을 때 Setter 메서드 사용
제어자 사용시 주의 사항
- 메서드에 static 과 abstract를 함께 사용 x
- 클래스에 abstract와 final을 동시에 사용 x
- abstract 메서드의 접근 제어자가 private 일 수 없다
- 메서드에 private와 final을 같이 사용할 필요 x
상속
- 부모 클래스의 필드와 메서드를 자식 클래스에게 물려준다
- 코드의 중복을 제거하고 유지 보수성을 높힌다!
- extends 키워드를 사용하여 상속을 정의
- 부모보다 자식 클래스가 확장된다!
- 자바는 기본적으로 다중 상속을 허용하지 않는다.
- 다중 상속 : 여러 부모를 가지는 것
추가로 알것!
- Final 클래스는 최종적인 클래스가 됨으로 더 이상 상속할 수 없는 클래스가 된다.
- Object가 최상위 부모 클래스
오버라이딩 override
- 상속 받은 메서드의 내용을 재정의 하는 것
- 조건
- 1. 선언부가 부모 클래스의 메서드와 일치
- 2. 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경 x
- 3. 예외는 부모 클래스의 메서드보다 많이 선언 x
super
- super을 통해 메서드를 상속 받을 시 자식 클래스의 필드 값이 아닌 부모 클래스의 필드 값이 변한다!
다형성
- 참조 변수의 타입변환
- 자동
- 부모 = new 자식()은 가능 -> 하지만 자식 메서드는 실행 불가
- 자식 = new 부모()는 불가능
- 강제타입 변환
- 자동 형변환을 한 아이들은 강제로 다시 돌아갈 수 있다.
- 다형성이란 여러가지 형태를 가질 수 있는 능력
instance of
- 다형성 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하는것이 필요
- instance of 를 사용하여 해당 객체가 내가 의도한 클래스의 객체인지 확인
- (대상 객체) instance of (클래스 이름)
// 다형성
class Parent { }
class Child extends Parent { }
class Brother extends Parent { }
public class Main {
public static void main(String[] args) {
Parent p = new Parent();
System.out.println(p instanceof Object); // true 출력
System.out.println(p instanceof Parent); // true 출력
System.out.println(p instanceof Child); // false 출력
Parent c = new Child();
System.out.println(c instanceof Object); // true 출력
System.out.println(c instanceof Parent); // true 출력
System.out.println(c instanceof Child); // true 출력
}
}
추상 클래스
- abstract 키워드를 사용해서 추상 클래스 선언 가능
- 부모는 완성 시키지 않고 자식이 완성 시키는 클래스
- 상속 받은 자식 클래스에서 추상 클래스의 메서드는 반드시 오버라이딩 되어야한다
- 자식 클래스 간의 겹치는 부분을 모아 추상 클래스로 만들 수 있다.
인터페이스
- 두 객체를 연결해주는 다리 역할
- 상속 관계가 없는 다른 클래스들이 서로 동일한 행위 즉 메서드를 구현해야 할 때 동일한 사용 방법과 행위를 보장.
- 인터페이스의 구현 클래스는 반드시 정의된 모든 메서드들을 구현
- interface 키워드를 사용하여 선언
- 모든 멤버 변수는 public static final 이어야함 (컴파일러가 자동 추가)
- 모든 메서드는 public abstract 이어야함 (컴파일러가 자동 추가)
- implements로 인터페이스 구현 가능
- 인터페이스의 추상메서드 중 일부만 구현해야 한다면 해당 클래스를 추상 클래스로 변경
- 인터페이스는 클래스와 다르게 다중 상속 가능
디폴트 메서드
- 디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드
- 메서드 앞에 default 키워드를 붙이며 {} 이 존재
- 인터페이스는 모든 메서드를 재정의 해야하니 인터페이스에 메서드 하나를 추가하고 다른 연결된 구현체들에서는 구현을 하지 않고 싶을때 사용
- 추상 메서드가 아니기 때문에 인터페이스의 구현체들에서 필수로 재정의 할 필요 x
static 메서드
- 인터페이스의 static 메서드 또한 객체 없이 호출 가능
- 인스턴스를 생성하지 않고 호출할 것이라면 static을 사용하는 것이 방법!
'Today I Learned' 카테고리의 다른 글
| Generic (0) | 2025.01.06 |
|---|---|
| 예외 처리! (2) | 2025.01.03 |
| 컬랙션이란? (0) | 2025.01.02 |
| JAVA란? (2) | 2024.12.31 |
| 온보딩 프로젝트를 마치며 (0) | 2024.12.30 |