클래스는 객체를 만들 수 있는 틀이며, 객체는 여러 속성들과 그 속성들을 사용해 기능을 구현한 메서드를 가지는 것으로, 클래스에 의해 생성되어 참조 변수가 그 객체의 주소를 가리키고 있다. 그리고 .(다트 연산자)를 사용해 "참조 변수.메서드()", "참조 변수.속성"로 해당 객체에 대한 속성을 가져오거나 메서드를 이용할 수 있다.
✔️ 같은 메서드에 대해서도 여러 결과가 나오는 이유는 어떤 객체가 메서드를 호출하는지가 중요하기 때문이다. 서로 다른 객체는 서로 다른 속성을 가지고 있고(물론 같은 속성을 가질 때도 있다.) 주소값이 다른 등 구분되는 점들이 존재한다. 따라서 같은 메서드라도 그 메서드를 호출한 객체가 다르면 서로 다른 결과값이 나올 수 있다.
A1. Yes! 여러 개의 클래스가 하나의 파일에 존재해도 된다.
A2. public
A3. No!
🔻 한 파일에 public 클래스가 두 개 이상 존재하는 코드(아래 코드는 Main 클래스 파일의 내용이다.)
public class A {}
class B {}
class Main{
public static void main(String[] args) {
}
}
👉🏻 클래스 A에 빨간 줄이 그어지는 것을 볼 수 있다.
👉🏻 마우스를 빨간 줄에 가져가면 아래 사진에 나와있는 같은 문장이 뜬다. 즉, public type이 존재할 시 그 클래스명은 파일명이 되어야 한다는 것이다.
A4. Yes! 모든 클래스에 붙이는 것은 불가능하지만, 모든 클래스에 작성하지 않는 것은 가능하다.
🔻 한 파일에 존재하는 여러 클래스에 모두 public이 존재하지 않는 코드
class A {}
class B {}
class Main{
public static void main(String[] args) {
}
}
👉🏻 코드 작성 결과 아무런 경고도 뜨지 않고 컴파일도 잘 된다.
✔️ 하지만, 메인 메서드인 public static void main(String[] args)는 언제나 파일명과 동일한 클래스명이 있는 블록에 작성해야 한다.
🔻 예시1) 아래 코드와 같이 메인 메서드 없이 run
class A {}
class B {}
public class Main {
}
👉🏻 Error 발생
A5. Yes!
생성자는 new 키워드로 클래스의 객체(인스턴스)가 생성될 때 제일 먼저 자동적으로 호출되는 메서드이다.
✔️ 클래스에서 생성자를 따로 작성하지 않으면 default constructor가 자동으로 호출된다.
👉🏻 클래스명과 동일하다. 또한, 디폴트 생성자에서는 받는 인자가 존재하지 않는다.
🔻 클래스 Car의 default constructor
class Car {
// 속성
int price;
String color;
// 생성자
Car() {} // 디폴트 생성자의 모습
// 메서드
void stop(){
System.out.println("stop()");
}
}
public class Main{
public static void main(String[] args){
}
}
✔️ 자바에서 생성자명은 클래스명과 같아야 한다.
✔️ 생성자는 보통 속성과 일반적인 메서드 사이에 기술한다.
✔️ 생성자는 호출만 가능하다.
✔️ 생성자는 리턴되는 반환값이 없다.(인자값을 받는 것은 가능하다.)
✔️ 생성자는 객체의 초깃값을 설정할 때 많이 사용한다.
✔️ 생성자는 여러 개 만들 수 있다.
👉🏻 디폴트 생성자가 아닌, 또 다른 생성자를 만들어도 객체를 생성할 때 구분이 가능하므로 괜찮다. (Ex) Car(70000000, "red")로 생성하는 객체와 Car()로 생성하는 객체는 구분이 가능하다! )
👉🏻 생성자는 오버로딩(overloading)이 가능하다.
🔻 디폴트 생성자가 아닌 다른 생성자 작성하기
class Car {
// 속성
int price;
String color;
// 생성자
Car() {} // 디폴트 생성자의 모습
Car(int price, String color) {
this.price = price;
this.color = color;
}
// 메서드
void stop(){
System.out.println("stop()");
}
void showCarInfo() {
System.out.println("가격: " + price + "색깔: " + color);
}
}
public class Main{
public static void main(String[] args){
Car car1 = new Car(70000000, "red"); // 객체 생성
Car car2 = new Car(80000000, "white"); // 객체 생성
}
}
✔️ this는 생성자 객체 자신이라고 생각하면 된다. (cf) Python에서는 this 대신 self를 사용한다.)
👉🏻 위의 코드에서 car1, car2를 가지고 이해해보자! car1, car2는 디폴트 생성자가 아닌 Car(int price, String color) 생성자 형태로 생성되었다. 이때 인자로 주어진 가격과 색깔을 생성된 각 객체의 속성 price와 name에 대입해야 하는데, 이때 car1, car2 각 객체를 의미하는 것이 바로 this이다. 즉, car1 객체가 생성될 때는 this가 car1이라는 의미이고 car2 객체가 생성될 때는 this가 car2라는 의미이다. 정리하자면 this는 생성되는 객체 자기 자신을 가리킨다!
인프런 예제로 공부하는 Java 100 문제풀이 Part3
Do it 자바프로그래밍 입문
점프 투 자바