이번 시간엔 객체와 클래스에 대해서 알아보도록 하겠습니다.🙂
객체지향 프로그래밍
객체(Object) 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지며 식별 가능한 것을 말합니다.
객체는 속성(필드+동작)으로 구성되어 있습니다.
클래스는 객체의 설계도입니다. 인스턴스는 클래스로부터 만들어진 객체를 의미합니다.
객체지향 프로그래밍 단계
- 클래스 설계 -> 설계된 클래스로 사용할 객체 생성(new) -> 객체 이용
객체의 생성과 클래스 변수
클래스로부터 객체를 생성합니다.
- new 클래스();
new 연산자로 메모리 힙 영역에 객체 생성합니다.
클래스 변수 = new 클래스();
객체 생성 후 객체 메모리 주소가 리턴됩니다.
클래스 변수에 저장하여 변수를 통해 객체 사용 가능합니다.
클래스의 두 용도
1. 라이브러리(API) 클래스로 활용되며 이때는 객체 생성 및 메소드 제공 역할을 합니다.
2. 실행 클래스는 main() 메소드 제공 역할을 합니다.
클래스 멤버
public class ClassName{
//필드
int fieldname;
//생성자
ClassName(){..}
//메소드
void methodName(){..}
}
- 필드 : 객체의 데이터가 저장되는 곳
클래스 외부에서 필드를 사용하는 경우 클래스로 부터 객체 생성한 뒤 사용합니다.
- 생성자 : 객체 생성 시(new 연산자 만났을 때) 초기화 역할 담당
생성자가 성공적으로 실행되면 힙 영역에 객체 생성되고 객체 번지가 리턴됩니다.
기본 생성자는 클래스 내부에 선언을 생략할 경우 자동으로 생성됩니다.
- 메소드 : 객체의 동작에 해당하는 실행 블록
메소드 호출 시 내부의 경우 단순히 메소드 이름으로 호출합니다.
외부의 경우 클래스로부터 객체 생성한 참조 변수를 사용하여 메소드 호출해야 합니다.
클래스 인스턴스 멤버와 정적 멤버
클래스에 선언된 필드와 메소드가 모두 객체 내부에 포함되는 것은 아닙니다.
객체가 있어야 사용 가능한 멤버가 있고, 그렇지 않은 멤버도 있습니다.
객체가 생성돼야 사용가능한 멤버를 인스턴스 멤버라고 합니다.
클래스명에 .(도트) 연산자를 활용하여 사용가능한 멤버를 정적(static) 멤버라고 합니다.
인스턴스 멤버 (객체를 생성한 후 사용할 수 있는 필드와 메소드)
- 인스턴스 필드 : 객체마다 다른 데이터를 저장합니다.
- 인스턴스 메소드 : 객체마다 가지고 있는 메소드입니다.
public class Car {
//필드
int gas;
//메소드
void setSpeed(int speed){..}
}
Car myCar = new Car();
myCar.gas = 10;
myCar.setSpeed(60);
Car myCar2 = new Car();
myCar2.gas = 20;
myCar2.setSpeed(80);
이런 코드를 실행시켰을 때,

이렇게 힙 영역에 2개의 다른 객체로 생성되는 것을 볼 수 있습니다.
정적 멤버 ( 객체와 상관X)
- 정적 필드 및 상수 : 객체 없이 클래스만으로도 사용 가능한 필드입니다.
- 정적 메소드 : 객체 없이 클래스만으로도 호출 가능한 메소드입니다.
public class 클래스{
//정적필드
static 타입 필드 [=초기값];
//정적메소드
static 리턴 타입 메소드(매개변수선언,...){...}
}
static이라는 키워드만 붙이면 정적필드, 정적메소드가 됩니다!

정적 필드와 정적메소드는 클래스의 고정된 멤버이므로 클래스로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리됩니다.
따라서 클래스로딩이 끝나면 바로 사용할 수 있습니다.
public class Calculator {
static double pi = 3.14195;
static int plus(int x, int y) {..}
static int minus(int x, int y) {..}
}
double result1 = 10 * 10 * Calculator.pi;
int result2 = Calculator.plus(10,5);
int result3 = Calculator.minus(10,5);
이렇게 정적 멤버 사용은 클래스 이름과 함께 도트 연산자로 접근하면 됩니다!
인스턴스 멤버 vs 정적 멤버
그렇다면 어떨 때 인스턴스 멤버를 사용하고 어떨 때 정적 멤버를 사용해야 할까요?
인스턴스 멤버와 정적 멤버 선택 기준
- 객체마다 다를 수 있는 필드 값 -> 인스턴스 필드로 선언
- 그렇지 않고 객체마다 다를 필요가 없는 필드값 -> 정적 필드로 선언
🚨주의할 점🚨
정적 메소드 선언 시 그 내부에 인스턴스 필드 및 인스턴스 메소드 사용이 불가합니다.
static void Method{
this.field1 = 10; // (x 컴파일 에러)
this.method(); // (x 컴파일 에러)
}
정적 메소드에서 인스턴스 멤버를 사용하려면 객체를 먼저 생성하고 참조변수로 접근해야 합니다.
static void Method(){
ClassName obj = new ClassName();
obj.field1 = 10;
obj.method1();
}
🔆마무리🔆
오늘 공부한 인스턴스는 스프링을 이용한 프로젝트에서 api를 Singleton 패턴으로 만들 때 굉장히 많이 썼던 기억이 납니다. 자세히 모르고 썼지만 인스턴스에 대해서 더욱 자세하게 알게 되었으니, 다음 프로젝트를 할 때 인스턴스에 더욱 유의하여 만들어봐야 겠습니다 :)
'🧮Programming > Java' 카테고리의 다른 글
| [Java] 상속, 다형성 (0) | 2024.02.06 |
|---|---|
| [Java] 패키지와 접근 제한자 (0) | 2024.02.06 |
| [Java] 배열(Array) (0) | 2024.02.05 |
| [Java] 참조 타입 (1) | 2024.02.04 |
| [Java] Java기초 문법 (0) | 2024.02.04 |