중앙정보기술인재개발원/JAVA

[JAVA] 클래스

soidev 2025. 3. 20. 18:05

클래스

    자바에서는 설계도가 바로 클래스이다. 클레스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.

    클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 한다.

  • 형태를 "정의"하는 문법, 데이터의 형태만 정의
  1. 클래스 선언
    • public class 클래스 이름 {  }
    • 인스턴스만 생성 가능
    • 그 참조값을 무조건 받아줘야지만 의미 있음
    • 클래스명 선언할 때 대문자
  2. 객체 생성과 클래스 변수
    • 클래스로부터 객체를 생성하려면  → new 클래스( ) ;  //이 코드는 생성되자마자 사라짐
    • new 연산자는 힙 영역에 객체를 생성시킨 후 객체의 번지를 리턴하도록 되어있음
    • 클래스 변수 = new 클래스 ( ) ;
  3. 인스턴스
    • 생성 문법 = new 클래스명();
    • 인스턴스 하나하나 생성된 메모리
  4. 생성자
    • new 연산자로 호출되는 특별한 중괄호 {} 블록
    • 역할은 객체 생성시 초기화를 담당
    • 인스턴스 생성시 자동으로 실행됨
    • 생성자를 정의를 할 때 () <- 안에다 매개 변수 선언가능
    • 클래스명 그대로 쓰기
    • 매개변수 두개 이상 선언 가능
  5. 접근연산자
    • .(점, Access Operator) → 객체의 멤버 변수(필드)나 메서드에 접근할 때 사용하는 연산자
    • 객체명.변수명 또는 객체명.메서드명() 형태로 사용됨
    • 객체가 생성되지 않은 상태에서 접근하면 오류 발생  →반드시 객체를 생성(new)한 후에 접근해야 함
    • 객체 내부에 또 다른 객체가 있다면 계속해서 .을 사용해 접근 가능 (p.addr.city)
    •  클래스 내부에 정의된 변수(필드)나 메서드를 사용할 때 필수적인 문법
    • 힙메모리에 접근하겠음
  6. 오버로딩
    • 매개변수를 달리하는 생성자를 여러 개 선언
    • 매개변수 : 값을 전달하기 위한 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 클래스의 생성자들이 서로 호출될 수 있다는 점을 말하고 있습니다.

분석:

  1. 생성자 오버로딩: StudentP6 클래스는 3개의 생성자를 정의하고 있습니다:
    • StudentP6(String name, int b, int score): 3개의 매개변수를 받는 생성자
    • StudentP6(): 매개변수가 없는 기본 생성자
    • StudentP6(String name, int age): 2개의 매개변수를 받는 생성자
  2. StudentP6 st3 = new StudentP6();: 이 코드에서 st3는 기본 생성자인 StudentP6()를 호출합니다. 이때 출력문에 "기본 생성자 실행 됨!!"이 나타날 것입니다. 이는 매개변수가 없는 생성자가 호출된 경우입니다.
  3. 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