객체지향 프로그래밍
- 소프트웨어의 필요한 부품(객체)들을 만들고 하나씩 조립해 하나의 완성된 프로그램을 만드는 기법
캡슐화
- 필드와 메서드를 하나로 묶어 객체로 만든 후 내부 구현 내용을 외부에서 알 수 없게 감춤 (보안 좋음)
- 외부에서 해당 객체의 필드와 메서드를 변경하지 못하도록 함
- 접근 제어자를 통해 해당 객체의 필드와 메서드를 노출시킬지 감출지 결졍
상속
- 부모 객체가 가지고 있는 필드와 메서드를 자식 객체에게 주어 사용할 수 있도록 함
- 자식 객체에선 부모의 필드와 메서드를 그대로 사용할지 변경할지 정할 수 있음
- 코드의 중복이 줄어들고 재사용성이 증가함
다형성
- 설계도에 따라 구현된 객체들은 메서드를 서로 다르게 재정의 하여 사용할 수 있다
- 하나의 메서드를 여러가지 형태로 재구성하는 것을 의미
추상화
- 객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것
- 공통적이고 중요한 것들을 모아 객체를 모델링함
객체와 클래스
- 클래스를 토대로 생성된 객체를 해당 클래스의 "인스턴스"라고 부르며 이 과정을 "인스턴스화"라고 한다
- 동일한 클래스로 여러 개의 인스턴스를 만들 수 있다
생성자
- 객체를 만들 때 어떻게 만들지 강제하는 것
- 클래스와 이름이 같다
- 리턴타입이 없다
- this : 인스턴스 자신을 가르킨다
메서드 오버로딩 : 하나의 메서드 이름으로 여러 기능을 구현하는 것
- 메서드의 이름이 같고, 매개변수의 개수, 타입, 순서가 달라야 한다 (매개변수 차이로만 구현)
- 장점 : 메서드의 이름을 절약할 수 있다
매개변수
- 기본형 매개변수 : 값 자체가 복사되어 넘어가기 때문에 매개값으로 지정된 변수의 원본 값이 변경되지 않는다
- 참조형 매개변수 : 값이 저장된 곳의 원본 주소를 알고 있기 때문에 값을 읽기, 변경 가능
double brakePedal(char type) {
speed = 0;
type = 'P';
changeGear(type);
return speed;
}
Tire setTire(Tire tireCompany) {
tireCompany.company = "KIA";
tire = tireCompany;
return tire;
}
// 기본형 매개변수
char type = 'D';
car.brakePedal(type);
// 메서드 실행 완료 후 전달할 매개값으로 지정된 type 값 확인
System.out.println("type = " + type);
// 기존에 선언한 값 'D' 출력, 원본 값 변경되지 않음
// 메서드 실행 완료 후 반환된 car 인스턴스의 gear 타입 확인
System.out.println("gear = " + car.gear);
// 객체 내부에서 type을 변경하여 수정했기 때문에 'P' 출력
// 참조형 매개변수
Tire tire = new Tire();
tire.company = "금호"; // 금호 타이어 객체 생성
// 차 객체의 타이어를 등록하는 메서드 호출한 후 반환값으로 차 객체의 타이어 객체 반환
Tire carInstanceTire = car.setTire(tire);
// 메서드 실행 완료 후 전달할 매개값으로 지정된 참조형 변수 tire의 company 값 확인
System.out.println("tire.company = " + tire.company); // "KIA" 출력
// 전달할 매개값으로 지정된 tire 인스턴스의 주소값이 전달되었기 때문에 호출된 메서드에 의해 값이 변경됨.
// 메서드 실행 완료 후 반환된 car 인스턴스의 tire 객체 값이 반환되어 저장된 참조형 변수 carInstanceTire의 company 값 확인
System.out.println("carInstanceTire.company = " + carInstanceTire.company); // "KIA" 출력
멤버 : 필드 + 메서드
- 필드와 메서드는 선언하는 방법에 따라 인스턴스 멤버와 클래스 멤버로 구분할 수 있다.
- 클래스 멤버로 선언된 메서드는 인스턴스 멤버를 사용할 수 없다.
- 인스턴스 멤버로 선언된 메서드는 클래스 멤버를 사용할 수 있다.
- 클래스 멤버는 객체 생성 없이 바로 사용가능 하기 때문에 객체가 생성되어야 하는 인스턴스 멤버를 사용할 수 없다.
String model = "GV80";
static String company = "GENESIS";
// 사용 가능
String getCompany() {
return "(주)" + company;
}
// model이 인스턴스 필드이기 때문에 클래스 멤버 메서드에 사용 불가능
static String setCompany(String companyName) {
// System.out.println("자동차 모델 확인: " + model);
company = companyName;
return company;
}
- 인스턴스 멤버 : 객체 생성 후 사용 가능
- 객체가 인스턴스화 될 때 매번 저장하지 않고, 메서드는 메서드 영역에 두고 모든 인스턴스들이 공유해서 사용
- 대신 무조건 인스턴스를 통해서만 메서드가 사용될 수 있도록 제한을 걸어둠
- 클래스 멤버 : 객채 생성 없이도 사용 가능
- 메서드 영역의 클래스와 같은 위치에 고정적으로 위치하고 있는 멤버를 의미
- 필드와 메서드를 클래스 멤버로 만들기 위해서는 static 키워드를 사용
- Class.Field or Method() 로 객체 생성 없이 간단하게 사용 가능
지역변수
- 해당 메서드가 실행될 때마다 독립적인 값을 저장하고 관리한다.
- 메서드 내부에서 정의될 때 생성된다.
- 메서드가 종료될 때 소멸된다.
- 전역변수와 반대된다.
상수(final)
- final 필드는 초기값이 저장되면 해당 값을 프로그램이 실행하는 도중에 절대 수정할 수 없다
- 반드시 초기값을 지정해줘야 된다
- 예시 : final String company = "GENESIS";
접근 제어자 : 폴더상에서 어디까지 접근을 허용할 것인가
- public : 접근 제한이 전혀 없음(공개적)
- protected : 같은 패키지 내에서 또는 다른 패키지의 자손 클래스에서 접근이 가능
- default : 같은 패키지 내에서만 접근이 가능
- private : 같은 클래스 내에서만 접근이 가능
- 클래스 : public, default
- 메서드 & 멤버변수 : public, protected, default, private
- 그 외 제어자 : static, final, abstract
Getter
- 외부에서 객체의 private 한 필드를 읽을 필요가 있을 때 사용
Setter
- 외부에서 객체의 private 한 필드를 저장/수정할 필요가 있을 때 사용