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);
}
}