Programing Language/Java

[Java] 클래스의 구성 요소(Member of Class)

vinedpillar 2022. 6. 11. 02:24

클래스의 구성 요소

  • 필드(field): 객체의 속성을 정의하는 영역입니다

  • 컨스트럭터(constructor): 객체의 생성 방법을 정의하는 영역입니다.

  • 메서드(method): 객체의 기능을 정의하는 영역입니다.

 

 

 

 

필드(field)

  • 필드는 객체의 속성, 즉 데이터를 저장하는 역할을 합니다.

  • 데이터는 종류에 따라 아래와 같이 구분할 수 있습니다.
    • 고유 데이터: 객체를 다른 객체와 구분짓는 고유한 데이터
    • 상태 데이터: 객체의 현재 상태를 표현할 수 있는 데이터
    • 참조 데이터: 다른 객체와의 상호작용을 가지는 데이터

  • 필드의 선언 방법
    • 필드 선언 시 자료형은 기본 타입과 참조 타입 모두 사용 가능합니다.
    • 필드 변수 선언 후 값을 지정하지 않았을 경우 인스턴스 생성 시 자동으로 해당 타입의 기본값으로 초기화됩니다.
    • 필요한 경우 필드 선언과 동시에 값을 대입하여 초기값을 지정할 수 있습니다.
    • 접근제어자는 객체의 데이터에 접근을 제어하는 요소로 객체의 캡슐화와 관련이 있습니다.
필드의 선언 방법

// 변수만 선언할 경우
접근제어자 자료형 변수이름

// 변수의 초기값을 지정할 경우
접근제어자 자료형 변수이름 = 초기값;

 

필드 선언 예시

// 학생의 정보를 가지는 클래스 생성
public class StudnetExample {
    // 필드의 선언
    // 보통 필드는 클래스에서 가장 먼저 선언
    private String nation = "대한민국";
    private int studentId;
    private String name;
    private int age;
    private char grade;
    private int testScore;
}

 

 

 

 

컨스트럭터(constructor)

  • 컨스트럭터는 클래스를 통해 인스턴스를 생성하는 방법을 제공합니다.

  • 하나의 클래스는 반드시 하나 이상의 컨스트럭터를 가지고 있습니다.
    (컨스트럭터를 2개 이상으로 변형하여 사용하는 것을 오버로딩 기법이라고 함)


  • 만약 컨스터럭터가 선언되어있지 않다면 프로그램 컴파일 시 컴파일러가 자동으로 기본 컨스트럭터를 생성해줍니다.
    (반대로 컨스트럭터가 선언되어있을 경우 기본 생성자는 추가되지 않음)

  • 컨스트럭터의 선언 방법
    • 컨스트럭터 선언 시 클래스의 이름과 완전히 동일한 이름을 사용합니다.
    • 컨스트럭터는 매개변수가 없는 경우와 매개변수를 지정하는 경우로 구분됩니다.
    • 매개변수가 없는 경우 괄호(( ... )) 부분과 중괄호 ({ ... }) 부분을 비워둡니다.
    • 매개변수가 있는 경우 괄호 부분에 필요한 매개변수를 입력한 후 중괄호 부분에 인스턴스 필드 변수를 초기화 하는 코드를 입력해줍니다.
      (매개변수는 콤마(,)를 이용하여 필요한 개수만큼 추가 가능)
    • 매개변수를 인스턴스의 필드 값으로 넣는데는 this 예약어를 사용합니다.
컨스트럭터의 선언 방법

// 기본 컨스트럭터
// 클래스의 접근제어자 설정이 public이면 컨스트럭터도 public으로 선언
접근제어자 클래스이름() {
    // 매개변수가 없으므로 비어있게 됨
}

// 매개변수가 있는 컨스트럭터
접근제어자 클래스이름(매개변수) {
    // 매개변수가 있는 경우
    // this는 인스턴스 스스로를 가리키는 예약어
    this.매개변수 = 매개변수;
}

 

컨트스럭터 선언 예시

// 기본 컨스트럭터
public Student() {
    // 매개변수가 없으므로 빈칸    
}
    
// 매개변수가 있는 컨스트럭터
public Student(String name, int age, char grade) {
    this.name = name;
    this.age = age;
    this.grade = grade;
}

 

 

 

 

자신을 가리키는 this 예약어

  • this는 인스턴스 자신을 가리키는 자바의 예약어입니다.

  • 주로 객체 생성 시 데이터를 원하는 값으로 초기화하거나 스스로의 컨스트럭터를 호출하는데 사용됩니다.

  • this: 자기 자신을 참조하는 용도로 사용
    • 인스턴스 스스로의 변수에 접근하기 위해 사용되므로, 엄밀하게는 클래스의 모든 멤버에 this.를 붙여야 합니다.
    • 이러한 번거로움을 줄이기 위해 컴파일시 컴파일러가 클래스의 모든 멤버에게 this를 추가해주기 때문에 생략이 가능합니다.
    • 다만 이를 생략할 경우 프로그래머가 필드 변수와 지역 변수의 이름을 구분하기 어려워지기 때문에 this.를 붙여 구분하는 용도로 활용합니다.
  • this(): 클래스 내의 다른 컨스트럭터를 호출하는 용도로 사용
    • this()는 클래스 내에 중복된 컨스트럭터가 많을 때 이를 간소화하기 위해 사용됩니다. 
    • this()를 통해 다른 컨스트럭터의 초기화 코드를 불러와 적용할 수 있습니다.
    • 따라서 this()는 컨스트럭터의 내부에서만 사용이 가능합니다.
    • 또한 this()가 메모리 초기화의 역할을 해주기 때문에 반드시 컨스트럭터 선언의 첫 번째 줄에 사용되어야 합니다.

 

 

 

 

메서드(method)

  • 메서드는 객체의 동작과 기능을 프로그램 코드로 구현한 것을 뜻합니다.

  • 메서드는 특정 매개변수를 통해 내부 연산을 거쳐 특정 반환값을 구하는 일종의 함수라고 할 수 있습니다. 

  • 객체는 이러한 메서드를 통해서 다른 객체와 상호작용할 수 있게 됩니다.

  • 메서드의 선언 방법
    • 메서드는 반환자료형, 메서드 이름, 매개변수로 구성된 선언부와 메서드를 실행하는 코드 블럭으로 나눠집니다.
    • 반환 자료형: 메서드가 실행된 후 메서드를 호출한 곳으로 돌려줄 결과물의 자료형을 뜻합니다.
      (반환할 값이 없는 메서드라면 void 예약어로 반환값이 없음을 명시합니다.)
    • 메서드 이름: 메서드의 이름은 프로그래머가 원하는대로 작성하지만 이름만으로 메서드의 기능을 충분히 유추할 수 있도록 짓는 것이 좋습니다. 
      (일반적으로 첫 문자가 소문자인 카멜 케이스로 명명)
    • 매개변수: 메서드가 구동할 때 필요한 변수를 받기 위해 선언되며, 필요한 만큼 콤마(,)를 붙여 추가할 수 있습니다.
      (매개변수가 필요없다면 생략이 가능)
    • 실행블럭: 선언부에 이어지는 중괄호({ ... }) 부분에는 실행할 코드가 작성됩니다.
메서드 선언 방법

반환자료형 메서드이름(매개변수) {
	
    메서드 실행시 동작하는 코드 블럭
    
}

 

메서드 작성 예시

// 학생의 성적을 이용하여 등급을 확인하는 메서드
// int 타입의 score를 받아 char 타입으로 반환
public char getGrade(int score) {
    // 결과를 입력받을 변수 선언 
    char grade;
    
    // 점수에 따른 등급 판단 로직
    // 90점 이상일 경우 A를, 그 외는 F 부여
    if(score >= 90) {
    	grade = 'A';
    }
    else {
    	grade = 'F';
    }
    
    // char 타입의 grade를 반환
    retrun grade;
}

// 반환값이 없는 메서드인 경우 void 키워드를 통해 반환값이 없음을 표기
public void showStudentInfo() {
    // 학생의 정보를 출력하는 로직
    System.out.println(name + ", " + age + ", " grade);
}

 

 

 

 

return 문의 활용

  • 리턴문은 메서드에서 사용되며, 메서드의 실행을 종료하고, 제어의 흐름을 메서드가 호출되었던 곳으로 돌아가는 기능을 제공합니다.

  • 메서드에 반환 자료형이 명시되어 있다면, 반드시 return과 반환 값을 선언해야합니다.

  • 리턴문은 메서드의 실행을 강제로 종료하기 때문에 실행 블럭 안에서 제어 흐름 상 return의 호출보다 뒤쪽에 코드가 있다면 실행되지 않고, 오류가 발생하게 됩니다.

  • 메서드의 기능에 따라 반환값이 없는 경우도 있는데, 이 경우 메서드의 선언부에 void를 선언하여 반환값이 없음을 명시해야 합니다. 

  • 필요에 따라 this를 반환할 수 도 있는데 인스턴스 스스로의 주소값을 반환받을 수 있습니다. 
    (return this;)
반환값의 설정

retrun 반환값;

 

 

 

 

가변길이 매개변수

  • 동일한 자료형의 매개변수가 여러 개 필요한 메서드의 경우, 입력할 변수의 총 개수를 예측하기 어려울 수 있습니다.

  • 이럴 때 가변길이 매개변수로 선언하면 복수의 매개변수를 받을 수 있게 됩니다.

  • 이는 컴파일러가 가변 매개변수를 배열로 자동으로 변환해주기 때문에 가능해집니다.
    (즉 매개변수로 배열을 넣어도 같은 결과를 얻을 수 있음)
가변길이 매개변수의 선언

반환자료형 메서드이름(매개변수자료형 ... 변수이름) {

}

 

가변길이 매개변수 사용 예시

// 입력받은 숫자를 더하는 프로그램
public class Calculator {
    int sum(int ... values) {
        int sum = 0;
    
        for(int i = 0; i < values.length; i++) {
    	    sum += values[i];
    	}
    
    	return sum;
    }
}

// 메서드 확인 클래스
public class CalculatorExample {
	public static void main(String[] args) {
    	// Calculator의 인스턴스 생성
        Calculator cal = new Calculator();
        
        // 가변길이 매개변수를 활용해 다양한 개수의 숫자 합산 
        // 1, 2, 3의 합계를 result1에 저장
        int result1 = cal.sum(1, 2, 3);
        
        // 2, 4, 6, 8의 합계를 result2에 저장
        int result2 = cal.sum(2, 4, 6, 8);
        
        // 6 출력
        System.out.println(result1);
        // 20 출력
        System.out.println(result1);        
    	
    }    
}

 

 

 

 

 

3가지 요소가 모두 들어간 클래스 예시

클래스 선언 예시

// 학생의 정보를 가지는 클래스
public class Studnet {
    // 필드 영역
    public String nation = "대한민국";
    public int studentId;
    public String name;
    public int age;
    public char grade;
    public int testScore;
    
    
    // 컨스트럭터 영역
    public Student() {
    
    }
    
    public Student(String name, int age, char grade) {
    	this.name = name;
        this.age = age;
        this.grade = grade;
    }
    
    // 메서드 영역
    public char getGrade(int score) {
        char grade;

        if(score >= 90) {
            grade = 'A';
    	}	
        else {
    	    grade = 'F';
        }
    
        retrun grade;
    }

    public void showStudentInfo() {
        System.out.println(name + ", " + age + ", " grade);
    }   
}