- 본 강의 내용 중에서 제일 중요하다고 생각하는 것들이 많다고 생각하여 내용이 많음.
1 ) 설계도 ( 클래스 )
- 객체지향 프로그래밍?
- 필요한 부품을 만들고 하나씩 조립해서 하나의 완성된 프로그램을 만들 수 있는 기법.
- '객체지향 프로그래밍'
- 필요한 부품을 만들고 하나씩 조립해서 하나의 완성된 프로그램을 만들 수 있는 기법.
- 객체란?
- 세상에 존재하는 물체를 뜻하며 식별이 가능.
- 소프트웨어의 객체들끼리 상호작용하는 것.
- 객체들은 메서드를 통해 데이터를 주고 받을 수 있다.
- 소프트웨어의 객체 간의 관계?
- 사용관계, 포함관계, 상속관계
- 특징.
- 캡슐화 - 속성(필드)와 행위(메서드)를 하나로 묶어 객체로 만든 후 실제 내부 구현 내용은 외부에서 알 수 없게 감추는 것
- 외부 객체에선 캡슐화된 내부 구조를 알 수 없기 때문에 노출시켜 준 필드 혹은 메서드를 통해 접근 할 수 있다.
- 숨기는 이유는 외부 객체에서 해당 필드와 메서드를 잘못 사용하여 객체가 변화하지 않게 하는데 있다.
- Java에서는 캡슐화된 객체의 필드와 메서드를 노출시킬지 감출지 결정하기 위해 접근 제어자를 사용한다.
- 상속 - 객체지향 프로그래밍에서는 부모 객체와 자식 객체가 존재. 부모 객체가 가지고 있는 필드와 메서드를 자식 객체들에게 물려주어 사용할 수 있도록 만든다.
- 상속을 사용하는 이유?
- 상속 관계로 묶음으로써 객체 간의 구조 파악이 쉬워짐.
- 필드와 메서드를 변경하는 경우 부모 객체만 수정하면 되기에 일관성을 유지하기 좋다.
- 자식 객체가 부모 객체의 필드와 메서드를 물려받아 사용하기에 코드 중복이 줄어들고 재사용성 증가.
- 상속을 사용하는 이유?
- 다형성 - 객체가 연산을 수행할 때 하나의 행위에 대한 각 객체가 가지고 있는 고유한 특성에 따라 다른 여러가지 형태로 재구성되는 것을 의미.
- 추상화 - 객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것.
- 공통적이고 중요한 것들을 모아 객체를 모델링.
- 캡슐화 - 속성(필드)와 행위(메서드)를 하나로 묶어 객체로 만든 후 실제 내부 구현 내용은 외부에서 알 수 없게 감추는 것
2 ) 클래스 설계
- 객체를 생성하기 위한 설계도. 구성 멤버는 필드, 생성자, 메서드가 존재
- 4STEP
- 만들려고 하는 설계도를 선언합니다. (클래스 선언)
- 객체가 가지고 있어야 할 속성(필드)을 정의합니다.
- 객체를 생성하는 방식을 정의합니다. (생성자)
- 객체가 가지고 있어야 할 행위(메서드)를 정의합니다.
- 4STEP
public class Car {
// <필드 영역>
// 1) 고유데이터 영역
String company; // 자동차 회사
String model = "Gv80"; //자동차 모델
String color; // 자동차 색
double price; // 자동차 가격
// 2) 상태 데이터 영역
double speed; // 자동차 속도
char gear; // 기어상태 (P, R, N, D)
boolean lights = true; // 자동차 조명 상태
// 3) 객체 데이터 영역
Tire tire = new Tire();
Door door;
Handle handle;
// <생성자 영역>
//생성자 : 처음 객체가 생성될 때(instance화) 어떤 로직을 수행해야 하며, 어떤 값이 필수로 들어와야 하는지 정의!
public Car() {
// logic
// 기본생성자 : 생략이 가능
System.out.println("생성자가 호출되었습니다! 객체가 생성됩니다.");
}
// <메서드 영역>
//gasPedal
//input : kmh
//output : speed
double gasPedal(double kmh, char type) {
changeGear(type); // 가속도 패달을 밟으면 자동으로 기어가 변한다.
speed = kmh;
return speed;
}
//brakePedal
//input : x
//output : speed 0
double brakePedal() {
speed = 0;
return speed;
}
//changeGear
//input : gear(char)
//output :gear
char changeGear(char type) {
gear = type;
return gear;
}
//onOffLight
//input : x
//output : light(boolean)
boolean onOffLights() {
lights = !lights;
return lights;
}
//horn
//input : x
//output :
void horn() {
System.out.println("빵빵");
}
//자동차의 속도 .. 가변길이 메서드
void carSpeeds(double ... speeds) {
for(double v : speeds) {
System.out.println("v = " + v);
}
}
}
3 ) 객체 생성과 참조형 변수
- 객체 생성
new Car(); // Car클래스 객체 생성
- 참조형 변수
Car car1 = new Car(); // Car클래스의 객체인 car1 인스턴스 생성
Car car2 = new Car(); // Car클래스의 객체인 car2 인스턴스 생성
- new 연산자를 통해서 객체가 생성되면 해당 인스턴스의 주소가 반환되기 떄문에 해당 클래스의 참조형 변수를 사용하여 받을 수 있다.
- 객체 배열 - 참조형 변수와 동일하게 취급되기 때문에 배열 또는 컬렉션에도 저장하여 관리할 수 있다.
4 ) 객체의 속성 : 필드
- 필드란?
- 객체의 데이터를 저장하는 역할.
- 필드의 초기값과 초기화
- 우리가 정의하여 선언한 클래스의 필드들은 기본적으로 초기값을 제공하지 않을 경우 객체가 생성될 때 자동으로 기본값.
- 초기값 제공 방법 '필드 타입 필드 명 = 값;' 으로 직접 초기화.
String model = "GV80";
- 필드 사용 - 필드의 값을 변경하거나 읽는 것
- 외부접근 - 내부 필드에 접근하는 방법 도트(.)연산자를 사용.
- 내부접근 - 도트 연산자를 사용하여 외부에서 객체 내부에 접근할 수 있을 뿐만 아니라 내부 메서드에서도 내부 필드에 접근 가능.
5 ) 객체의 행위 : 메서드
- 메서드는 객체의 행위를 뜻하여 객체 간의 협력을 위해 사용
- 메서드의 행위를 정의하는 방법은 블록 {} 내부에 실행할 행위를 정의하면 된다.
- 메서드 선언
리턴타입 메서드명(매개변수, ...) {
실행할 코드 작성
}
- 주의할 점은 리턴 타입을 선언하여 반환할 값이 있다면 반드시 retunr 문으로 해당하는 리턴 타입의 반환값을 지정.
- 반환할 값이 없을 때 리턴 타입을 'void'로 지정.
- 반환값이 없을 땐 return 문을 반드시 지정할 필요 없음.
- 매개변수 - 메서드를 호출할 때 메서드로 전달하려는 값을 받기 위해 사용되는 변수.
- 전달하려는 값이 없으면 생략가능.
- 가변 길이의 매개 변수도 선언 가능
void carSpeeds(double ... speeds) {
for(double v : speeds) {
System.our.println("v = " + v );
{
}
- ... 을 사용하면 매개값을 , 로 구분하여 개수 상관없이 전달 가능.
'TIL > Java' 카테고리의 다른 글
TIL 2024-10-16 (Java 종합만 문법) (2) | 2024.10.16 |
---|---|
TIL 2024-10-15 (Java 문법 종합반) (2) | 2024.10.15 |
TIL 2024-10-14 (Java 문법 종합반) (2) | 2024.10.14 |
TIL 2024-10-10 (Java 문법 종합반) (0) | 2024.10.10 |
TIL 2024-10-08 (Java 문법 종합반) (3) | 2024.10.08 |