Java 문법 종합 3주차
객체의 행위 : 메서드
리턴타입 메서드명(매개변수, ...) {
실행할 코드 작성
}
리턴타입이란 메서드가 실행된 후 호출을 한 곳으로 값을 반환할 때 해당 값의 타입을 의미
return 리턴타입의 반환값;
가변길이의 매개변수 선언
void carSpeeds(double ... speeds) {
for (double v : speeds) {
System.out.println("v = " + v);
}
}
예) carSpeeds(110, 120, 150);
매개값을 , 로 구분하여 개수 상관없이 전달 가능
메서드 호출 방법
- 외부 접근
Car car = new Car();
이렇게 객체를 생성했다면 우리는 참조변수 car를 이용하여 외부에서 객체 내부의 메서드에 접근하여 호출
객체의 내부 메서드에 접근하는 방법 ▶ 도트(.) 연산자 사용
car.brakePedal();
매개변수의 순서와 타입에 맞게 매개값을 넣어줘야 함
car.gasPedal(100, 'D');
- 내부 접근
double gasPedal(double kmh, char type) {
changeGear(type);
speed = kmh;
return speed;
}
gasPedal(double kmh, char type) 메서드 내부에서 해당 객체의 changeGear(type); 메서드를 호출할 수 있다.
기본형 & 참조형 매개변수
기본형 매개변수
메서드를 호출할 때 전달할 매개값으로 지정한 값을 메서드의 매개변수에 복사해서 전달
매개변수의 타입이 기본형일 때는 값 자체가 복사되어 넘어가기 때문에 매개값으로 지정된 변수의 원본 값이 변경되지 않는다.
참조형 매개변수
메서드를 호출할 때 전달할 매개값으로 지정한 값의 주소를 매개변수에 복사해서 전달
매개변수를 참조형으로 선언하면 값이 저장된 곳의 원본 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경하는 것도 가능하다.
뭔 말인지 모르겠다..
인스턴스 멤버와 클래스 멤버
인스턴스 멤버
= 인스턴스 필드 + 인스턴스 메서드
클래스 멤버
= 클래스 필드 + 클래스 메서드
클래스 변수는 static 키워드를 사용하여 선언되며, 클래스에 속하는 변수로 모든 인스턴스에서 공유
지역변수
메서드 내부에 선언한 변수
메서드가 실행될때마다 독립적인 값을 저장하고 관리
메서드 내부에서 정의될때 생성되어 메서드가 종료될 때까지만 유지된다.
final 필드와 상수
final String company = "GENESIS";
...
Car car = new Car();
System.out.println(car.company);
final 필드는 초기값이 저장되면 해당 값을 프로그램이 실행하는 도중에는 절대로 수정할 수 없다.
상수
값이 반드시 한개. 불변의 값을 의미한다.
static final String COMPANY = "GENESIS";
...
System.out.println(Car.COMPANY);
생성자
객체가 생성될 때 호출
객체를 초기화하는 역할
public Car() {} // 선언
...
Car car = new Car(); // 호출
생성자는 반환 타입이 없고 이름은 클래스의 이름과 동일하다.
기본생성자 ▶ 선언할 때 괄호( ) 안에 아무것도 넣지않는 생성자
모든 클래스는 반드시 생성자가 하나 이상 존재해야 하는데, 만약 클래스에 생성자를 하나도 선언하지 않았다면 컴파일러는 기본 생성자를 바이트코드 파일에 자동으로 추가시켜준다. 이런 경우에는 기본 생성자 생략이 가능하다.
컴파일러에 의해 생성되는 기본 생성자는 해당 클래스의 접근 제어자를 따름
public class Car {
public Car() {} // 컴파일러가 추가시켜줌
}
class Car {
Car() {} // 컴파일러가 추가시켜줌
}
생성자 오버로딩
package week03.constructor;
public class Car {
static final String COMPANY = "GENESIS"; // 자동차 회사 : GENESIS
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격
double speed; // 자동차 속도 , km/h
char gear = 'P'; // 기어의 상태, P,R,N,D
boolean lights; // 자동차 조명의 상태
Tire tire = new Tire();
Door door = new Door();
Handle handle = new Handle();
// (1) : 오버로딩
public Car(String modelName) {
model = modelName;
System.out.println("첫 번째 생성자가 호출되었습니다.");
}
// (2)
public Car(String modelName, String colorName) {
model = modelName;
color = colorName;
System.out.println("두 번째 생성자가 호출되었습니다.");
}
// (3)
public Car(String modelName, String colorName, double priceValue) {
model = modelName;
color = colorName;
price = priceValue;
System.out.println("세 번째 생성자가 호출되었습니다.");
}
double gasPedal(double kmh, char type) {
changeGear(type);
speed = kmh;
return speed;
}
double brakePedal() {
speed = 0;
return speed;
}
char changeGear(char type) {
gear = type;
return gear;
}
boolean onOffLights() {
lights = !lights;
return lights;
}
void horn() {
System.out.println("빵빵");
}
Car returnInstance() {
return this;
}
}
package week03.constructor;
public class Main {
public static void main(String[] args) {
// 기본 생성자 호출 오류 확인
// Car car1 = new Car(); // 오류 발생
// 생성자 오버로딩을 통해 여러 상황에서 자동차 생산
// 제네시스 자동차를 생산 : static final String COMPANY = "GENESIS"; 상수 고정
// 모든 자동차는 생산시 기어의 최초 상태 'P' 로 고정 : char gear = 'P'; 직접 대입하여 초기화
// GV60 모델만 기본으로 선택
Car car2 = new Car("GV60");
System.out.println("car2.model = " + car2.model);
System.out.println("car2.gear = " + car2.gear + "\n");
// GV70 모델, 색상 Blue 만 기본으로 선택
Car car3 = new Car("GV70", "Blue");
System.out.println("car3.model = " + car3.model);
System.out.println("car3.color = " + car3.color);
System.out.println("car3.gear = " + car3.gear + "\n");
// GV80 모델, 색상 Black, 가격 50000000 으로 완전하게 고정된 경우
Car car4 = new Car("GV80", "Black", 50000000);
System.out.println("car4.model = " + car4.model);
System.out.println("car4.color = " + car4.color);
System.out.println("car4.price = " + car4.price);
System.out.println("car4.gear = " + car4.gear + "\n");
}
}
개수, 타입, 순서가 동일한데 매개변수명만 다르게 하는 경우는 오버로딩 규칙에 위배된다.
public Car(String modelName, String colorName, double priceValue)
public Car(String colorName, String modelName, double priceValue)
이러면 안됨!
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 , protected , default , private
그 외 제어자 : static , final , abstract
접근제어자
멤버 또는 클래스에 사용, 외부에서 접근하지 못하도록 제한
클래스, 멤버변수, 메서드, 생성자에 사용되고, 지정되어 있지 않다면 default
public : 접근 제한 없음
protected : 같은 패키지 내에서, 다른 패키지의 자손클래스에서 접근 가능
default : 같은 패키지 내에서만
private : 같은 클래스 내에서만(보수적)
사용가능한 접근 제어자
- 클래스 : public , default
- 메서드 & 멤버변수 : public , protected , default , private
- 지역변수 : 없음
클래스 내부에 선언된 데이터를 보호하기 위해서 사용
생성자의 접근 제어자는 클래스의 접근 제어자와 일치한다.
Getter와 Setter
객체의 무결성(변경이 없는 상태)를 위해 private, default 등의 접근 제어자를 사용하는데,
그럼 어떻게 객체의 private 필드를 읽어오거나 저장할 수 있을까?
▶ Getter와 Setter를 사용하여 해결할 수 있다!
Getter
private double speed; // 자동차 속도 , km/h
private char gear = 'P'; // 기어의 상태, P,R,N,D
private boolean lights; // 자동차 조명의 상태
public String getModel() {
return model;
}
public String getColor() {
return color;
}
public double getPrice() {
return price;
}
메서드 이름 규칙 : get + 필드이름(첫 글자 대문자)
Setter
private double speed; // 자동차 속도 , km/h
private char gear = 'P'; // 기어의 상태, P,R,N,D
private boolean lights; // 자동차 조명의 상태
public void setModel(String model) {
this.model = model;
}
public void setColor(String color) {
this.color = color;
}
public void setPrice(double price) {
this.price = price;
}
메서드 이름 규칙 : set + 필드이름(첫 글자 대문자)
package와 import
전체 경로를 명시해서 클래스에 접근
package week03.packageExample.pk1;
public class Car {
public void horn(){
System.out.println("pk1 빵~!");
}
}
import를 해서 클래스에 접근
package week03.packageExample.main;
import week03.packageExample.pk1.Car;
public class Main {
public static void main(String[] args) {
Car car = new Car();
car.horn(); // pk1 빵~!
}
}

몇 번을 다시 봐야 40% 정도 이해가 되는 느낌이다..
'TIL' 카테고리의 다른 글
| TIL 241017 (0) | 2024.10.17 |
|---|---|
| TIL 241016 (0) | 2024.10.16 |
| TIL 241014 (0) | 2024.10.14 |
| TIL 241011 (0) | 2024.10.11 |
| TIL 241010 (0) | 2024.10.10 |