이전에 배운 내용
[JAVA] 메서드 오버로딩 println( ); , 기본형 참조형 매개변수
[JAVA] 메서드 오버로딩 println( ); , 기본형 참조형 매개변수
이전에 배운 내용 [JAVA] 객체의 필드와 메서드 [JAVA] 객체의 필드와 메서드 이전 내용 [JAVA] 객체 생성 방법 [JAVA] 객체 생성 방법 이전에 만든 class Car로 객체를 만들어봅시다. [JAVA] 클래스 설계 방
dev-story93.tistory.com
지금 배울 내용은 인스턴스 멤버와 클래스 멤버이다
멤버 = 필드 + 메서드
- 인스턴스 멤버 = 인스턴스 필드 + 인스턴스 메서드
- 클래스 멤버 = 클래스 필드 + 클래스 메서드 (= Main클래스가 대표적인 예이다.)
인스턴스 멤버 & 클래스 멤버
- 필드와 메서드는 선언하는 방법에 따라서 인스턴스 멤버와 클래스 멤버로 구분할 수 있습니다.
- 인스턴스 멤버는 객체 생성 후에 사용할 수 있고 클래스 멤버는 객체 생성 없이도 사용할 수 있습니다
인스턴스 멤버
지금까지 우리가 배운 필드와 메서드는 전부 인스턴스 멤버이다.
인스턴스 멤버는 객체를 생성해야 사용할 수 있다.
객체의 인스턴스 필드는 각가의 인스턴스마다 고유하게 값을 가질 수 있습니다.
(인스턴스멤버는 객체를 만들 때마다 독립적인 멤버를 가진다. 단, 매번 생성 때마다 메서드를 생성하진 않는다 사용이 가능하게 할 뿐)
- 그렇다면 객체가 인스턴스화할 때마다 객체의 메서드들은 인스턴스에 포함되어 매번 생성이 될까요?
- 그렇지 않습니다. 매번 저장한다면 중복 저장으로 인해 메모리 효율이 매우 떨어지기 때문에 메서드는 메서드 영역에 두고서 모든 인스턴스들이 공유해서 사용합니다.
- 대신 무조건 객체를 생성 즉, 인스턴스를 통해서만 메서드가 사용될 수 있도록 제한을 걸어둔 것입니다.
클래스 멤버
클래스는 Java의 클래스 로더에 의해 메서드 영역에 저장되고 사용됩니다.
- 이때 클래스 멤버란 메서드 영역의 클래스와 같은 위치에 고정적으로 위치하고 있는 멤버를 의미합니다.
- 따라서 클래스 멤버는 객체의 생성 필요 없이 바로 사용이 가능합니다.
- 고윳값을 가진 변하지 않는 클래스를 가질 때 사용한다.
클래스 멤버의 선언
클래스 멤버를 만들려면 static 키워드를 사용한다.
- 일반적으로 인스턴스마다 모두 가지고 있을 필요 없는 공용적인 데이터를 저장하는 필드는 클래스 멤버로 선언하는 것이 좋습니다.
- 또한 인스턴스 필드를 사용하지 않고 실행되는 메서드가 존재한다면 static 키워드를 사용하여 클래스 메서드로 선언하는 것이 좋습니다.
⚠️ 주의할 점
- 클래스 멤버로 선언된 메서드는 인스턴스 멤버를 사용할 수 없습니다.
- 반대로 인스턴스 멤버로 선언된 메서드는 클래스 멤버를 사용할 수 있습니다.
- 클래스 멤버는 객체 생성 없이 바로 사용 가능하기 때문에 객체가 생성되어야 존재할 수 있는 인스턴스 멤버를 사용할 수 없습니다.
static String company = "KIA"; // 자동차 회사 : KIA
String getCompany() {
return "(주)" + company;
}
클래스를 통해 자동차를 만들 때 자동차의 회사가 KIA로 고정되어 있다면 모든 Car클래스 객체마다 company 인스턴스 필드들 가질 필요 없이 클래스필드로 만들어 공유하게 된다면 메모리 사용성이 효율적으로 관리가 될 것입니다.
또한 인스턴스 메서드인 getCompany( )는 클래스 필드인 company를 사용할 수 있습니다.
static String setCompany(String companyName) {
// System.out.println("자동차 모델 확인: " + model); // 인스턴스 사용 불가
company = companyName;
return company;
}
- 자동차 회사를 변경할 수 있는 setCompany(String companyName)를 클래스 메서드로 만들어서 사용할 수 있습니다.
- 이때 인스턴스 필드인 model을 사용하려고 하면 오류가 발생합니다.
클래스 멤버 사용
Car.company = "Audi";
String companyName = Car.setCompany("Benz");
클래스 멤버는 static으로 선언되기 때문에 클래스 이름으로 바로 접근이 가능하다
클래스 멤버를 사용하려면 클래스의 이름과 함께 도트(.) 연산자를 사용하면 됩니다.
Car car = new Car(); // 객체 생성
car.company = "Ferrari";
String companyName2 = car.setCompany("Lamborghini");
- 참조형 변수를 사용하여 클래스 멤버에 접근은 가능하지만 비추천!.
- 클래스 이름으로 접근하는 것이 좋다.
예제
자동차 클래스
public class Car {
static String company = "GENESIS"; // 자동차 회사 : GENESIS
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격
double speed; // 자동차 속도 , km/h
char gear; // 기어의 상태, P,R,N,D
boolean lights; // 자동차 조명의 상태
public Car() {} // 기본 생성자
double gasPedal(double kmh, char type) {
changeGear(type);
speed = kmh;
return speed;
}
double brakePedal() {
speed = 0;
return speed;
}
char changeGear(char type) {
gear = type;
return gear;
}
boolean onOffLights() {
lights = !lights;
return lights;
}
void horn() {
System.out.println("빵빵");
}
String getCompany() {
return "(주)" + company;
}
static String setCompany(String companyName) {
// System.out.println("자동차 모델 확인: " + model); // 인스턴스 필드 사용 불가
company = companyName;
return company;
}
}
메인 클래스
public class Main {
public static void main(String[] args) {
// 클래스 필드 company 확인
System.out.println(Car.company + "\n");
// 클래스 필드 변경 및 확인
Car.company = "Audi";
System.out.println(Car.company + "\n");
// 클래스 메서드 호출
String companyName = Car.setCompany("Benz");
System.out.println("companyName = " + companyName);
System.out.println();
// 참조형 변수 사용
Car car = new Car(); // 객체 생성
car.company = "Ferrari";
System.out.println(car.company + "\n");
String companyName2 = car.setCompany("Lamborghini");
System.out.println("companyName2 = " + companyName2);
}
}
다음은 지역변수와 상수에 대해 공부하자!
'언어(language) > 자바(Java)' 카테고리의 다른 글
| [JAVA] 생성자, this와 this( ) (0) | 2023.10.19 |
|---|---|
| [JAVA] 지역변수와 상수 (0) | 2023.10.19 |
| [JAVA] 메서드 오버로딩 println( ); , 기본형 참조형 매개변수 (0) | 2023.10.19 |
| [JAVA] 객체의 필드와 메서드 (0) | 2023.10.18 |
| [JAVA] 객체 생성 방법 (2) | 2023.10.18 |