[자바(Java)] 클래스(Class)-(2)

4204 단어 JavaJava

✨ 클래스 정리

클래스는 객체를 만들 수 있는 틀이며, 객체는 여러 속성들과 그 속성들을 사용해 기능을 구현한 메서드를 가지는 것으로, 클래스에 의해 생성되어 참조 변수가 그 객체의 주소를 가리키고 있다. 그리고 .(다트 연산자)를 사용해 "참조 변수.메서드()", "참조 변수.속성"로 해당 객체에 대한 속성을 가져오거나 메서드를 이용할 수 있다.

✔️ 같은 메서드에 대해서도 여러 결과가 나오는 이유는 어떤 객체가 메서드를 호출하는지가 중요하기 때문이다. 서로 다른 객체는 서로 다른 속성을 가지고 있고(물론 같은 속성을 가질 때도 있다.) 주소값이 다른 등 구분되는 점들이 존재한다. 따라서 같은 메서드라도 그 메서드를 호출한 객체가 다르면 서로 다른 결과값이 나올 수 있다.

📍 Q1. 하나의 파일에 두 개 이상의 클래스를 작성할 수 있는가?

A1. Yes! 여러 개의 클래스가 하나의 파일에 존재해도 된다.

📍 Q2. 여러 개의 클래스가 한 파일에 있을 때 자바 파일명이 될 수 있는 것은 (A2) 키워드가 있는 클래스이다.

A2. public

📍 Q3. 여러 개의 클래스가 한 파일에 있을 때 모든 클래스에 public 키워드가 있어도 괜찮은가?

A3. No!

🔻 한 파일에 public 클래스가 두 개 이상 존재하는 코드(아래 코드는 Main 클래스 파일의 내용이다.)

public class A {}
class B {}
class Main{
	public static void main(String[] args) {
    }
}

👉🏻 클래스 A에 빨간 줄이 그어지는 것을 볼 수 있다.

👉🏻 마우스를 빨간 줄에 가져가면 아래 사진에 나와있는 같은 문장이 뜬다. 즉, public type이 존재할 시 그 클래스명은 파일명이 되어야 한다는 것이다.

📍 Q4. 여러 개의 클래스가 한 파일에 있을 때 모든 클래스에 public 키워드가 없는 것은 괜찮은가?

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 발생

📍 Q5. 파일에 하나의 클래스만 존재한다면 그 클래스가 파일명이 되어야 하는가?

A5. Yes!

✨ 생성자(Constructor)

생성자는 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 자바프로그래밍 입문
점프 투 자바

좋은 웹페이지 즐겨찾기