본문 바로가기
컴퓨터/JAVA

[Java] 자바의 클래스/생성자/접근제어자/객체 배열(this 키워드

by 도도새 도 2023. 6. 19.

자바의 클래스 

 

클래스(Class)는 객체지향 프로그래밍에서 가장 기본적인 개념 중 하나이다. 클래스는 객체를 생성하기 위한 템플릿이며, 객체의 상태와 행위를 정의하는데 사용된다. 자바(Java)에서 클래스는 다음과 같이 정의된다.

 

public class MyClass {
    // 멤버 변수 (인스턴스 변수)
    private int myVariable;

    // 생성자
    public MyClass() {
        // 생성자 코드
    }

    // 메서드
    public void myMethod() {
        // 메서드 코드
    }
}

 

클래스는 객체를 생성하기 위한 템플릿이므로, 클래스로부터 객체를 생성하여 사용할 수 있다.

 

MyClass myObject = new MyClass();

 

멤버 변수 (Member Variables):

  • 클래스 내부에 선언된 변수로, 클래스의 상태를 나타냄
  • 멤버 변수는 클래스의 객체(인스턴스)마다 고유한 값이 가질 수 있음
  • 일반적으로 private 접근 제어자를 사용하여 외부에서 직접 접근을 제한(캡슐화)

 

메소드 (Methods):

  • 클래스에서 수행되는 작업을 정의하는 함수
  • 메소드는 입력값을 받을 수 있고, 결과값을 반환
  • 객체의 동작과 행위를 구현하며, 클래스 외부에서 호출하여 사용
  • 즉 클래스의 함수

 

생성자 (Constructors):

  • 클래스의 인스턴스(객체)를 초기화하는 특별한 메소드
  • 생성자는 클래스와 동일한 이름을 가지며, 객체가 생성될 때 자동으로 호출
  • 주로 멤버 변수의 초기값 설정, 객체 생성 시 필요한 작업 수행에 사용
  • 생성자는 반환값이 없고, void 등의 반환 타입을 지정하지 않음

 

접근 제어자(Access modifier)

 

각 메소드나 맴버 변수에는 접근 제어자를 상용한다. 접근 제어자는 해당 프로퍼티의 접근 가능 범위를 나타낸다

 

접근 제어자 클래스 내부 동일 패키지 하위 클래스
public O O O
protected O O O
(default) O O X
private O X X

“전체적으로 접근 가능” 의 경우 외부 패키지에서 접근 여부 가능 여부를 나타낸다.

 

즉,

 

public

  • 접근 제한이 없다.
  • 보통 생성자 앞, 메서드 앞에 붙는다.

 

protected

  • 같은 패키지 내, 그리고 다른 패키지의 자손 클래스에서 접근 가능

 

default

  • 같은 패키지 내에서 접근 가능
  • 접근 지정자를 지정하지 않을시 자동으로 적용된다.

 

private

  • 같은 클래스 내에서만 접근 가능

 

package pack2;

public class Hello {
    Hello(){
        System.out.println("생성자 호출!");
    }
}
--------------
package pack1;
import pack2.Hello;
public class Main {
    public static void main(String[] args){
        Hello h1 = new Hello();
    }
}

오류

'Hello()' is not public in 'pack2.Hello'. Cannot be accessed from outside package

(Hello() 생성자가 default이므로 다른 패키지에서 접근 불가)

 

this 키워드

 

Java의 this 키워드는 클래스의 객체를 생성했을때, 해당 객체의 메모리 주소를 담고있는 참조이다. 따라서 this를 사용하여 현재 객체의 멤버 변수와 메서드에 접근할 수 있다.

 

객체의 주소를 가지고 있으므로 도트 연산자(.)를 이용해 해당 객체의 맴버 변수나 메소드에 접근할 수 있다.

 

public class Student {
    private int studentId;
    private String student_name;
    public  Student(int studentId, String student_name){
        this.studentId = studentId;
        this.student_name = student_name;
    }
    public void printInfo(){
        System.out.println(this.studentId+ " " + this.student_name);
    }
}

 

생성자의 this는 추후 객체가 생성되면 해당 객체를 가르킨다.

즉, this. studentId와 this.studnet_name은 해당 객체의 studentId와 해당 객체의 student_name을 명시적으로 나타낸 것이다.

 

this()

클래스 내에서 this()를 사용하면 생성자를 호출한다.

  • this()는 생성자 내에서만 호출 가능
  • this()는 문장의 제일 처음에 와야함
  • 재귀 호출이 불가능

 

package pack2;
public class Student {
    private int studentId;
    private String student_name;
    public Student(){
        System.out.println("기본 생성자 호출");
    }
    public  Student(int studentId, String student_name){
        this();
        this.studentId = studentId;
        this.student_name = student_name;
    }
    public void printInfo(){
        System.out.println(this.studentId+ " " + this.student_name);
    }
}

 

public class Main {
    public static void main(String[] args){
        Student s1 = new Student(1231322, "hehehe");
        s1.printInfo();
    }
}

 

출력값

기본 생성자 호출
1231322 hehehe

 

즉, 생상자 내에 this()를 사용하여 기본 생성자를 호출하고 있음을 확인할 수 있다.

생성자도 오버로딩이 되기에 this의 매개변수를 다르게 함으로서 다른 생성자를 호출 가능하다.

*기본 생성자는 매개변수를 가지지 않는 생성자.

 

객체 배열

 

Student studentArr[] = new Student[10]; 와 같은 형태

public class Main {
    public static void main(String[] args){
        Student stArr[] = new Student[10];
        String names[] = {"a", "b", "c", "d" ,"e", "f", "g", "h", "i", "j"};
        for(int i = 0; i < 10; i++){
            stArr[i] = new Student(i, names[i]);
        }

        for(int i = 0; i < 10; i++){
            stArr[i].printInfo();
        }
    }
}

*instance of를 사용하면 객체의 클래스를 확인 가능하다

댓글