클래스
자바에서는 설계도가 바로 클래스이다. 클레스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.
클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 한다.
- 형태를 "정의"하는 문법, 데이터의 형태만 정의
- 클래스 선언
- public class 클래스 이름 { }
- 인스턴스만 생성 가능
- 그 참조값을 무조건 받아줘야지만 의미 있음
- 클래스명 선언할 때 대문자
- 객체 생성과 클래스 변수
- 클래스로부터 객체를 생성하려면 → new 클래스( ) ; //이 코드는 생성되자마자 사라짐
- new 연산자는 힙 영역에 객체를 생성시킨 후 객체의 번지를 리턴하도록 되어있음
- 클래스 변수 = new 클래스 ( ) ;
- 인스턴스
- 생성 문법 = new 클래스명();
- 인스턴스 하나하나 생성된 메모리
- 생성자
- new 연산자로 호출되는 특별한 중괄호 {} 블록
- 역할은 객체 생성시 초기화를 담당
- 인스턴스 생성시 자동으로 실행됨
- 생성자를 정의를 할 때 () <- 안에다 매개 변수 선언가능
- 클래스명 그대로 쓰기
- 매개변수 두개 이상 선언 가능
- 접근연산자
- .(점, Access Operator) → 객체의 멤버 변수(필드)나 메서드에 접근할 때 사용하는 연산자
- 객체명.변수명 또는 객체명.메서드명() 형태로 사용됨
- 객체가 생성되지 않은 상태에서 접근하면 오류 발생 →반드시 객체를 생성(new)한 후에 접근해야 함
- 객체 내부에 또 다른 객체가 있다면 계속해서 .을 사용해 접근 가능 (p.addr.city)
- 클래스 내부에 정의된 변수(필드)나 메서드를 사용할 때 필수적인 문법
- 힙메모리에 접근하겠음
- 오버로딩
- 매개변수를 달리하는 생성자를 여러 개 선언
- 매개변수 : 값을 전달하기 위한 Parmeter
- 파라미터를 똑같이 오버로딩 할 수 없음, 매개변수 타입 순서가 똑같으면 안된다는 뜻
실습 코드
public class P6 {
public static void main(String[] args) {
int a = 10; //지역변수
StudentP6 st1 = new StudentP6("한조",30,70);
//생성자에다가 매개변수를 넣으면 인스턴스에도 형태를 똑같이 해야함
StudentP6 st2 = new StudentP6("트레이서",19,99);
StudentP6 st3 = new StudentP6(); //메모리만 생성할게
//둘중에 한개만 호출됨
StudentP6 st4 = new StudentP6("메르시",40);
//StudentP6 st3 = new StudentP6(null, 0, 0); //초기화할게
System.out.println(st1.name);
System.out.println(st2.name);
}
}
class StudentP6 {
String name; //클래스 내에선 그냥 접근이 가능해짐
int age;
int score;
//생성자 : 클래스명 그대로 쓰기 Constructor
//생성자를 정의를할때 () <-안에다 매개 변수 선언 가능
//매개변수 선언 가능 : 값을 전달하기 위한 Parmeter
//단, 인스턴스 생성시(new) 정의된 생성자의 형태대로 생성해야함
//매개변수 두개 이상 선언 가능
//응집도 높은게 this!!!!!!!!!!!!!!!
StudentP6(String name , int b, int score){
System.out.println("생성자1 실행됨!");
//. 힙메모리에 접근하겠음
this.name = name; //this !!! 중요함 | 문법적으로 정해진 주소값
age =b; //단, 지역변수에 변수형이 없을 시에 this 안 써도됨
//정확한 문법은 this.age=b 인데 this써도됨
this.score= score;
System.out.println("생성자1 실행 완료");
}
// 하나의 클래스에는 생성자를 여러개 선언할 수 있음
// 생성자 오버로딩 ( 오버라이딩 아님 주의 )
StudentP6(){ //파라미터를 똑같이 오버로딩 할 수 없음 - 타입 순서가 똑같음 안된다는 뜻
System.out.println("기본 생성자 실행 됨!!");
}
StudentP6(String name, int age){
//내부에 있는 다른 생성자를 실행???
this(name,age,0); //생성자가 실행될때 다른 생성자가 호출됨
//이 문법은 넘어가도됨.
System.out.println("2개짜리 생성자 호출됨");
// this.name=name;
// this.age=age;
}
}
"둘 중에 한 개만 호출됨"이라는 설명은 StudentP6 클래스의 생성자 오버로딩 방식과 관련이 있습니다. 여기서 **"둘 중에 하나"**는 StudentP6 클래스의 생성자들이 서로 호출될 수 있다는 점을 말하고 있습니다.
분석:
- 생성자 오버로딩: StudentP6 클래스는 3개의 생성자를 정의하고 있습니다:
- StudentP6(String name, int b, int score): 3개의 매개변수를 받는 생성자
- StudentP6(): 매개변수가 없는 기본 생성자
- StudentP6(String name, int age): 2개의 매개변수를 받는 생성자
- StudentP6 st3 = new StudentP6();: 이 코드에서 st3는 기본 생성자인 StudentP6()를 호출합니다. 이때 출력문에 "기본 생성자 실행 됨!!"이 나타날 것입니다. 이는 매개변수가 없는 생성자가 호출된 경우입니다.
- StudentP6 st4 = new StudentP6("메르시", 40);: st4는 StudentP6(String name, int age) 생성자를 호출합니다. 그런데 이 생성자 내부에서 또 다른 생성자를 호출하는 코드가 있습니다:즉, StudentP6(String name, int age) 생성자는 StudentP6(String name, int b, int score) 생성자를 호출하는 방식으로 동작합니다. 이로 인해 두 번째 생성자(StudentP6(String name, int age))가 호출되었을 때 내부적으로 첫 번째 생성자(StudentP6(String name, int b, int score))가 다시 호출됩니다.
this(name, age, 0); // 생성자 1 (3개의 매개변수)을 호출
"둘 중에 한 개만 호출됨"의 의미:
이 말은 StudentP6(String name, int age)와 같은 오버로딩된 생성자를 호출할 때, 내부적으로 다른 생성자가 호출될 수 있다는 점을 강조하는 것입니다. 즉, StudentP6(String name, int age) 생성자가 호출되면, 이 생성자 안에서 다른 생성자 (StudentP6(String name, int b, int score))가 한 번만 호출된다는 뜻입니다.
결론:
- 기본 생성자(StudentP6()): st3에서 호출됨.
- 두 매개변수 생성자(StudentP6(String name, int age)): st4에서 호출됨, 그리고 이 생성자 안에서 세 매개변수 생성자(StudentP6(String name, int b, int score))가 호출됨.
따라서 "둘 중에 한 개만 호출된다"는 표현은, 특정 생성자가 호출될 때 다른 생성자가 내부에서 호출될 수 있다는 점을 말하는 것입니다. st4에서 StudentP6(String name, int age)가 호출되고, 그 내부에서 StudentP6(String name, int b, int score)가 호출된다고 이해하면 됩니다.
'중앙정보기술인재개발원 > JAVA' 카테고리의 다른 글
| [JAVA] 싱글톤 (1) | 2025.03.24 |
|---|---|
| [JAVA] 메소드 (1) | 2025.03.21 |
| [JAVA] 배열 (1) | 2025.03.18 |
| [JAVA] Scanner (1) | 2025.03.17 |
| [2주차] 연산자 (0) | 2025.03.12 |