728x90
객체지향 프로그래밍
- 객체: 세상에 존재하는 물체. 식별이 가능한 것.
- 객체: 속성(필드) + 행위(메서드)
- 객체 모델링: 현실 세계에 있는 객체를 소프트웨어의 객체로 설계하는 것
- 객체 간 상호작용: 메서드를 통해 이루어짐
- 객체 간 관계
- 사용 관계
- 포함 관계
- 상속 관계
- 객체지향 프로그래밍의 특징
- 캡슐화: 필드와 메서드를 하나로 묶어 객체로 만든 후 실제 내부 구현은 외부에서 알 수 없게 감추는 것
- 캡슐화된 객체의 필드와 메서드를 노출 시킬 지 감출 지 결정하기 위해 접근 제어자 사용
- 상속: 부모 객체의 필드와 메서드를 자식 객체에 물려주는 것
- 객체들을 상속 관계로 묶음으로써 객체 간의 구조를 파악하기 쉬워짐
- 부모 객체의 필드와 메서드를 수정하면 자식 객체에 모두 반영되어 일관성을 유지하기 좋음
- 코드의 중복이 줄어들어 코드의 재사용성이 증가
- 다형성: 하나의 행위에 대해 각 객체가 가지고 있는 고유한 특성에 따라 재구성되는 것
- 같은 메서드의 구현을 다르게 재정의하여 사용 가능
- 추상화: 객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것
- 캡슐화: 필드와 메서드를 하나로 묶어 객체로 만든 후 실제 내부 구현은 외부에서 알 수 없게 감추는 것
- 객체와 클래스
- 클래스: 객체의 설계도
- 인스턴스: 클래스를 토대로 생성된 객체
- 인스턴스화
클래스 설계
- 클래스 선언
- public class Car { }
- 클래스 필드 정의
- String company;
- double speed; 등
- 클래스 생성자 정의
- public Car() { }: 반환 타입이 없고 클래스의 이름과 동일
- ()안에 아무것도 없는 생성자는 기본 생성자(생략 가능)
- 클래스 메서드 정의
- double gasPedal(double kmh) { speed = kmh; return speed; }
객체 생성과 참조형 변수
- Car car1 = new Car(); //Car클래스의 객체인 car1 인스턴스 생성
- 객체 생성 동시에 기본 생성자가 호출
- 객체는 참조형 변수와 동일하게 취급되므로 배열 또는 컬렉션에 저장하여 관리 가능
- 객체의 속성: 필드
- 필드: 객체의 데이터를 저장
- 고유 데이터, 상태 데이터, 객체 데이터로 분류 가능
- 필드들은 초기값을 제공하지 않을 경우 객체 생성 시 자동으로 기본값으로 초기화됨
- 필드 사용방법:
- 외부 접근: car.color = "blue" (도트 연산자 사용)
- 내부 접근: color (바로 호출)
- 객체의 행위: 메서드
- 메서드 선언: 리턴타입 메서드명(매개변수, ...) { }
- 매개변수
- void carSpeed(double ... speeds) { for (double v : speeds) {}}
- 이렇게 ...을 사용하면 매개값을 개수 상관없이 전달 가능
- 매서드 호출방법:
- 외부 접근: car.brakePedal(); (도트 연산자 사용)
- 내부 접근: 메서드 내에서 brakePedal(); 등으로 호출
- 메서드 오버로딩: 한 클래스 내에 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입, 순서가 다르면 동일한 이름으로 메서드 정의 가능
멤버: 필드, 메서드
- 인스턴스 멤버 = 인스턴스 필드 + 인스턴스 메서드
- 객체 생성 후에 사용 가능
- 객체의 인스턴스 필드는 각각의 인스턴스마다 고유한 값을 가질 수 있음
- 객체의 메서드는 메서드 영역에 두고 모든 인스턴스들이 공유 - 인스턴스를 통해서만 메서드 사용 가능
- 클래스 멤버 = 클래스 필드 + 클래스 메서드
- 클래스는 클래스 로더에 의해 메서드 영역에 저장되고 사용됨
- 클래스 멤버는 클래스와 같은 위치에 고정적으로 위치하고 있는 멤버
- 객체 생성 없이도 사용 가능
- 클래스 멤버 선언: static 사용 : 인스턴스의 공용적인 데이터를 저장하는 필드 일 때
- 클래스 멤버 사용: 클래스명.클래스 멤버
- 인스턴스 멤버인 메서드는 클래스 멤버 사용 가능
- 클래스 멤버인 메서드는 인스턴스 멤버 사용 불가능
- 지역 변수: 메서드 내부에 선언한 변수. 메서드 종료될 때까지만 유지됨
- final 필드: 초기값을 반드시 지정. 수정 불가능
- 상수: static final로 모든 인스턴스가 공유하면서 불변인 상수 선언. 일반적으로 대문자로 작성.
생성자
- 기본 생성자
- 모든 클래스는 반드시 생성자가 하나 이상 존재
- 생성자가 선언되지 않은 경우 컴파일러가 기본 생성자를 바이트 코드 파일에 자동으로 추가시켜줌 (기본 생성자 생략 가능)
- 생성자가 하나라도 선언되었다면 컴파일러가 기본 생성자를 추가하지 않음 (기본 생성자가 없으면 오류)
- 컴파일러가 생성한 기본 생성자는 해당 클래스의 접근 제어자를 따름
- 생성자의 역할: 객체의 필드 초기화
this와 this()
- this: 인스턴스 자신을 표현
- 매개변수명과 객체의 필드명이 동일한 경우 this 키워드 사용
- this(): 인스턴스 자신의 생성자를 호출
- 객체 내부 생성자 및 메서드에서 사용될 수 있음
- 다른 생성자를 호출할 때는 반드시 해당 생성자의 첫 줄에 작성되어야 함
접근 제어자
- 제어자: 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미 부여
- 접근 제어자: public, protected, default, private
- 그 외 제어자: static, final, abstract
- 접근 제어자: 멤버 또는 클래스에 사용하여 외부에서 접근하지 못하도록 제한
- 지정되어 있지 않다면 default
- public: 접근 제한 없음
- protected: 같은 패키지 내에서, 다른 패키지의 자손 클래스에서 접근 가능
- default: 같은 패키지 내에서만 접근 가능
- private: 같은 클래스 내에서만 접근 가능
- 접근 제어자는 클래스 내부에 선언된 데이터를 보호하기 위해 사용(무결성)
- 생성자에 접근 제어자를 사용해 인스턴스의 생성을 제한
- 일반적으로 생성자의 접근 제어자는 클래스의 접근 제어자와 일치
- 객체의 private 필드를 읽거나 저장하는 방법: Getter와 Setter
- Getter: 읽을 때
- (public) 메서드 이름 규칙: get+필드 이름(첫 글자 대문자)
- Setter: 저장/수정할 때
- (public) 메서드 이름 규칙: set + 필드 이름(첫 글자 대문자)
- Getter: 읽을 때
// Getter
public Stirng getColor() {
return color;
}
// Setter
public void setColor(String color) {
this.color = color;
}
- 제어자의 조합 (사용가능한 제어자
- 클래스 : public, default, final, abstract
- 메서드 : public, protected, default, private, final, abstract, static
- 멤버변수 : public, protected, default, private, final, static
- 지역변수 : final
- 제어자 주의 사항
- 메서드에 static과 abstract를 함께 사용할 수 없다.
- 클래스에 abstract와 final을 동시에 사용할 수 없다.
- abstract메서드의 접근 제어자가 private일 수 없다.
- 메서드에 private와 final을 같이 사용할 필요는 없다.
package와 import
- 상위 패키지와 하위 패키지를 도트(.)로 구분
- import: 다른 패키지에 있는 클래스를 사용하기 위해 명시하는 키워드
- 서로 다른 패키지에 있는 같은 이름의 클래스를 동시에 사용하려면 패키지명을 전부 명시해야 함
'[스파르타코딩클럽] > Java 문법 종합반' 카테고리의 다른 글
Chapter 9. 인터페이스 (0) | 2023.10.17 |
---|---|
Chapter 8. 상속 (0) | 2023.10.16 |
Chapter 6. 컬렉션 (0) | 2023.10.13 |
Chapter 5. 배열 (0) | 2023.10.13 |
Chapter 4. 조건문, 반복문 (0) | 2023.10.13 |