클래스 설계 단계
클래스의 구성 멤버에는 필드, 생성자, 메서드가 있다.
필드 (Fields)
필드는 클래스의 상태를 나타내는 변수다. 클래스의 인스턴스가 가지는 데이터를 저장하며, 클래스 내부에서 사용된다.
필드는 인스턴스 변수, 클래스 변수(정적 변수)로 나뉜다.
종류:
- 인스턴스 변수: 객체가 생성될 때마다 해당 객체에 대한 고유한 상태를 나타내는 변수입니다. 각 객체는 독립적인 값을 가진다.
private String model; // 인스턴스 변수
private int year; // 인스턴스 변수
- 클래스 변수 (static): 클래스 자체에 속하며, 모든 객체가 공유하는 상태를 나타내는 변수입니다. static 키워드로 선언됩니다.
private static int totalCars; // 클래스 변수
필드는 객체의 상태를 저장. 잘 정의된 필드는 클래스의 응집도를 높이고, 객체의 일관된 상태를 유지하는 데 도움을 줌.
코드로 보는 예시
public class Car {
private String model; // 인스턴스 변수
private int year;
private static int totalCars; // 클래스 변수
// 접근자와 설정자 (getter와 setter)
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public static int getTotalCars() {
return totalCars;
}
public static void setTotalCars(int totalCars) {
Car.totalCars = totalCars;
}
}
데이터 타입 | 기본값 |
byte | 0 |
char | \u0000(공백) |
int | 0 |
long | 0 |
float | 0.0F |
double | 0.0 |
boolean | false |
Array | null |
Class | null |
Interface | null |
생성자 (Constructors)
생성자는 클래스의 인스턴스가 생성될 때 호출되는 메서드. 객체 초기화에 사용되며, 필드를 초기화하거나 초기 설정을 수행하는 역할.
특징:
- 생성자의 이름은 클래스의 이름과 동일하다.
- 생성자는 리턴 값이 없다.
- 여러 개의 생성자를 오버로딩 가능.
- 모든 클래스는 반드시 생성자를 가진다.
생성자는 객체가 올바르게 초기화되도록 보장가능. 객체의 불변 조건을 설정하고, 초기 상태를 설정하는 데 중요하다.
생성자의 매개변수 : 생성자가 호출될 때 객체의 초기화를 위해 외부로부터 전달되는 값을 받아들이기 위한 변수입니다.
코드로 보는 생성자의 매개변수
public class Car {
private String model;
private int year;
// 매개변수가 있는 생성자
public Car(String model, int year) {
this.model = model;
this.year = year;
}
public void displayInfo() {
System.out.println("Model: " + model + ", Year: " + year);
}
public static void main(String[] args) {
// Car 객체를 생성할 때 매개변수로 "Toyota"와 2022를 전달
Car car = new Car("Toyota", 2022);
car.displayInfo(); // 출력: Model: Toyota, Year: 2022
}
}
기본 생성자와 매개변수가 있는 생성자가 있는 코드로 보는 예
public class Car {
private String model;
private int year;
private static int totalCars;
// 기본 생성자
public Car() {
this.model = "Unknown";
this.year = 0;
totalCars++;
}
// 매개변수가 있는 생성자
public Car(String model, int year) {
this.model = model;
this.year = year;
totalCars++;
}
// 다른 코드...
}
메서드 (Methods)
메서드는 클래스의 동작을 정의하는 함수. 객체의 행동을 구현하며, 필드 값을 읽거나 수정할 수 있다. 메서드는 일반 메서드와 정적 메서드로 나뉜다.
종류:
- 일반 메서드: 객체의 인스턴스를 통해 호출되는 메서드입니다.
- 정적 메서드 (static): 클래스에 속하며, 클래스 이름을 통해 호출됩니다. 객체와 무관하게 동작합니다. (static에 관한건 나중에 자세히 다룰예정)
메서드는 객체의 행동을 정의합니다. 잘 정의된 메서드는 클래스를 사용하는 사람들에게 명확한 인터페이스를 제공하고, 코드의 재사용성과 유지보수성을 높인다.
그리고 메서드 중엔 인스턴스 메서드와 정적메서드가 있다.
인스턴스 메서드 (Instance Methods)
인스턴스 메서드는 클래스의 인스턴스를 통해 호출되는 메서드입니다. 이러한 메서드는 클래스의 개별 객체에 속하며, 객체의 상태(필드)에 접근하고 이를 수정할 수 있습니다.
특징:
- 객체를 통해 호출: 인스턴스 메서드는 객체가 생성된 후에 해당 객체를 통해 호출할 수 있습니다.
- 인스턴스 변수와 메서드 접근: 인스턴스 변수와 다른 인스턴스 메서드에 접근할 수 있습니다.
- this 키워드 사용 가능: this 키워드를 사용하여 현재 객체를 참조할 수 있습니다.
- 구체적 상태 관리: 인스턴스 메서드는 객체의 상태를 관리하고 조작하는 데 사용됩니다.
인스턴스 메서드를 코드로 예시로 들자면
public class Car {
private String model;
private int year;
// 생성자
public Car(String model, int year) {
this.model = model;
this.year = year;
}
// 인스턴스 메서드
public void displayInfo() {
System.out.println("Model: " + model + ", Year: " + year);
}
public static void main(String[] args) {
Car car1 = new Car("Toyota", 2022);
Car car2 = new Car("Honda", 2023);
// 인스턴스 메서드 호출
car1.displayInfo(); // 출력: Model: Toyota, Year: 2022
car2.displayInfo(); // 출력: Model: Honda, Year: 2023
}
}
정적 메서드 (Static Methods)
정적 메서드는 클래스 자체에 속하는 메서드로, 객체를 생성하지 않고도 클래스 이름을 통해 호출할 수 있습니다. 정적 메서드는 주로 클래스 레벨의 동작을 정의하는 데 사용된다. 주로 유틸리티 함수나 특정 기능을 독립적으로 수행해야 할 때 유용하다. 정적 메서드를 사용하면 객체를 생성하지 않고도 필요한 기능을 제공할 수 있다, 코드의 효율성과 가독성을 높일 수 있다.
특징:
- 클래스를 통해 호출: 정적 메서드는 클래스 자체를 통해 호출됩니다. 객체를 생성할 필요가 없다.
- 정적 변수와 다른 정적 메서드 접근: 정적 변수와 다른 정적 메서드에 접근할 수 있습니다.
- 객체 상태와 무관: 정적 메서드는 객체의 상태(인스턴스 변수)와 무관하게 동작한다. 따라서 인스턴스 변수나 인스턴스 메서드를 직접 사용할 수 없다.
- 정적 변수만 접근 가능: 정적 메서드는 클래스의 정적 변수만 접근할 수 있다.
- 유틸리티 함수: 자주 사용하는 유틸리티 함수(예: 수학 계산, 문자열 조작 등)를 정의할 때 유용하다.
Math.sqrt(25); // Math 클래스의 정적 메서드 sqrt 호출
- this 키워드 사용 불가: this 키워드는 인스턴스를 참조하므로 정적 메서드에서는 사용불가.
- 독립적 동작: 정적 메서드는 인스턴스 변수에 접근할 수 없으며, 독립적으로 동작해야 한다.
예시:
클래스 정의
public class MathUtil {
// 정적 메서드 정의
public static int add(int a, int b) {
return a + b;
}
public static int subtract(int a, int b) {
return a - b;
}
}
정적 메서드 호출
public class Main {
public static void main(String[] args) {
// 객체 생성 없이 정적 메서드 호출
int sum = MathUtil.add(5, 3);
int difference = MathUtil.subtract(5, 3);
System.out.println("Sum: " + sum); // 출력: Sum: 8
System.out.println("Difference: " + difference); // 출력: Difference: 2
}
}
정적 메서드의 사용 사례
유틸리티 클래스: 수학 함수, 문자열 조작 등 공통 기능을 제공하는 클래스.
Math.sqrt(25); // Math 클래스의 정적 메서드 sqrt 호출
싱글톤 패턴: 싱글톤 패턴에서 유일한 인스턴스를 반환하는 메서드.
Singleton instance = Singleton.getInstance();
정적 팩토리 메서드: 객체 생성 로직을 캡슐화하는 메서드.
LocalDate date = LocalDate.of(2023, 7, 23);
정적 메서드의 제약
인스턴스 변수 사용 불가: 정적 메서드는 인스턴스 변수를 직접 사용할 수 없다. 객체의 상태와 무관하게 동작해야 하기 때문이다.
public class Example {
int instanceVar;
public static void staticMethod() {
// instanceVar = 10; // 오류: 정적 메서드에서 인스턴스 변수 사용 불가
}
}
생성자, 인스턴스, 메서드, 정적 메서드를 코드로 예로 들면
public class Car {
// 속성 (필드)
String color;
String model;
int speed;
// 생성자
public Car(String color, String model) {
this.color = color;
this.model = model;
this.speed = 0;
}
// 인스턴스 메서드
public void accelerate() {
speed += 10;
}
public void brake() {
speed = 0;
}
// 정적 메서드
public static void displayGeneralInfo() {
System.out.println("This is a car class.");
}
}
인스턴스 메서드와 정적 메서드 비교
특징 | 인스턴스 메서드 | 정적 메서드 |
호출 방식 | 객체를 통해 호출 | 클래스를 통해 호출 |
인스턴스 변수 접근 | 가능 | 불가능 |
정적 변수 접근 | 가능 | 가능 |
this 키워드 사용 | 가능 | 불가능 |
주 용도 | 객체의 상태 관리 및 조작 | 클래스 레벨의 동작 정의 및 유틸리티 |
인스턴스 메서드와 정적 메서드는 각각 다른 용도로 사용된다. 인스턴스 메서드는 객체의 상태를 관리하고 조작하는 데 사용되며, 정적 메서드는 클래스 레벨의 동작을 정의하고, 유틸리티 함수 등을 제공하는 데 사용된다. 이 두 가지 유형의 메서드를 적절히 사용함으로써 코드의 재사용성과 유지보수성을 높일 수 있다.
결론적으로 설계단계에서 Class -> constructor -> method(instance method 와 static 메서드가 있다)
'Java 문법정리 (Array부터)' 카테고리의 다른 글
기본형 매개변수, 참조형 매개변수 (2) | 2024.07.23 |
---|---|
return 문 (1) | 2024.07.23 |
객체란? (1) | 2024.07.23 |
StringBuffer, StringBuilder (0) | 2024.07.23 |
Collection: List (0) | 2024.07.22 |