객체란
int result = Calcilator.add(10, 20);
객체간의 관계
객체와 클래스
클래스 선언
public class 클래스이름{
}
객체 생성과 클래스 변수
new 클래스();
클래스 변수 = new 클래스();
Student s1 = new Student();
main()
메소드를 제공클래스 구성 멤버
클래스 내부의 생성자나 메소드에서 사용할 경우
필드= 변경할 값;
클래스 외부에서 사용할 경우: 객체를 생성한 뒤 필드사용해야함
Car myCar = new Car(); //객체 생성
myCar.speed = 60; //필드 사용
클래스 필드 선언
public class Car {
//필드
String company = "현대자동차";
String model = "그랜저";
String color = "검정";
int maxSpeed = 350;
int speed;
}
외부클래스에서 필드값읽고 변경
public class CarExample {
public static void main(String[] args) {
//객체 생성
Car myCar = new Car();
//필드값 읽기
System.out.println("제작회사: " + myCar.company);
System.out.println("모델명: " + myCar.model);
System.out.println("색상: " + myCar.color);
System.out.println("최고 속도: " + myCar.maxSpeed);
System.out.println("현재 속도: " + myCar.speed);
//필드값 변경
myCar.speed = 60;
System.out.println("수정된 속도: " + myCar.speed);
}
}
/*
제작회사: 현대자동차
모델명: 그랜저
색상: 검정
최고속도: 350
현재속도: 0
수정된 속도: 60
*/
모든 클래스는 반드시 생성자가 존재
만약 클래스 내부에 생성자를 생략했다면 컴파일러는 중괄호 내용이 비어있는 기본 생성자를 바이트 코드에 자동 추가
[public] 클래스() { }
생성자 선언
클래스 (매개변수 선언, …) {
//객체 초기화 코드
}
메소드와 비슷한 형식이며 리턴 타입이 없고, 클래스 이름과 동일
내부에는 객체 초기화 코드 작성
public class Car{
//생성자
Car(String model, String color, int maxSpeed) { }
}
Car myCar = new Car("그랜저", "검정", 300);
// 생성자에 매개변수가 선언되어 있으므로
// Car myCar = new Car(); 기본 생성자 호출 불가
필드 초기화
생성자에서 필드 초기화 가능
public class Korean {
String nation = "대한민국";
String name;
String ssn;
public Korean(String n, String s) {
name = n;
ssn = s;
}
}
//매개변수 초기값 설정
Korean k1 = new Koewan("박자바", "011225-1234567");
일반적으로 매개변수는 필드와 동일한 이름 사용
그러나 이 경우 필드와 매개변수 이름이 동일하기 때문에 생성자 내부에서 해당 필드에 접근 불가
-> 동일한 이름의 매개 변수가 사용 우선순위가 높기 때문
this.을 앞에 붙여서 해결, this는 자기 자신을 의미
public Korean(String name, String ssn) {
this.name(필드) = name(매개변수);
this.ssn = ssn;
}
생성자 오버로딩
매개변수를 달리하는 생성자를 여러개 선언하는 것
public class Car {
Car() {...} // 1
Car(String model) {...} // 2
Car(String model, String color) {...} // 3
Car(String model, String color, int maxSpeed) {...} // 4
}
// new 생성자로 호출할 때
//제공되는 매개값의 타입과 수에 의해 호출할 생성자 결정
Car car1 = new Car(); // 1번 호출
Car car2 = new Car("그랜저"); //2번 호출
Car car3 = new Car("그랜저", "검정"); // 3번 호출
Car car4 = new Car("그랜저", "검정", 300); // 4번 호출
매개변수의 타입과 개수 그리고 선언 순서가 같을 경우 매개변수 이름만 바꾸는 것은 오버로딩이 아님
Car(String model, String color) {..}
Car(String color, String model) {..} // 오버로딩 아님
다른 생성자 호출: this()
생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드 발생 위험
필드 초기화 내용은 한 생성자에만 집중적으로 작성하고, 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선
클래스( [매개변수, ...]) {
this(매개변수, ..., 값, ...); // 클래스의 다른 생성자 호출
실행문;
}
this()는 자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용
public class Car {
//필드
String company = "현대자동차";
String model;
String color;
int maxSpeed;
//생성자
Car() {
}
/*
변경 전:
Car(String model, String color) {
this.model = model;
this.color = "은색";
this.maxSpeed = 250;
}
*/
//변경 후
Car(String model) {
// this를 사용해서 마지막 생성자
// Car(String model, String color, int maxSpeed) 호출
this(model, "은색", 250);
}
Car(String model, String color) {
this(model, color, 250);
}
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
public class CarExample {
public static void main(String[] args) {
Car car1 = new Car();
System.out.println("car1.company : " + car1.company);
System.out.println();
Car car2 = new Car("자가용");
System.out.println("car2.company : " + car2.company);
System.out.println("car2.model : " + car2.model);
System.out.println();
Car car3 = new Car("자가용", "빨강");
System.out.println("car3.company : " + car3.company);
System.out.println("car3.model : " + car3.model);
System.out.println("car3.color : " + car3.color);
System.out.println();
Car car4 = new Car("자가용", "빨강", 200);
System.out.println("car4.company : " + car4.company);
System.out.println("car4.model : " + car4.model);
System.out.println("car4.color : " + car4.color);
System.out.println("car4.maxSpeed : " + car4.maxSpeed);
}
}
/*
car1.company : 현대자동차
car2.company : 현대자동차
car2.model : 자가용
car3.company : 현대자동차
car3.model : 자가용
car3.color : 빨강
car4.company : 현대자동차
car4.model : 자가용
car4.color : 빨강
car4.maxSpeed : 200
*/