1. 클래스 (Class)
- 객체 지향 프로그래밍에서 특정 객체를 생성하기 위한 일종의 틀을 의미
- 연관되어 있는 변수와 메소드의 집합
- 클래스 안에 있는 변수를 멤버 변수, 클래스 안의 메소드를 멤버 메소드라고 한다.
2. 객체 (Object)
- 클래스에 선언된 모양 그대로 메모리에 생성된 실체
3. 객체의 선언 및 생성 (메모리 할당)
public class Product {
// 변수인데, 클래스 안에 있는 변수: 멤버변수라 하고,
// 이 변수들은 어디 생긴다? Heap 메모리에 생긴다!!!
int number;
String name;
// 클래스는 메소드도 있다.
// 아래처럼 출력하는 메소드 만든다.
// 제품번호 : 1, 제품명 : 컴퓨터
void print() {
System.out.println("제품번호 : "+ number +", 제품명 : "+ name);
}
}
위와 같은 Product 클래스가 있을 때, 객체를 만드는 법을 알아보자.
- 객체 변수 선언 : 클래스명 객체명;
- 객체 변수 생성 : 객체명 = new 클래스명();
- 객체의 선언과 생성은 한 줄로도 표현 가능
Product p1; // 객체 변수 선언
p1 = new Product(); // 객체 생성. 변수에 실제로 객체의 메모리 할당
Product p1 = new Product(); // 객체 변수 선언과 생성
// 객체에 데이터를 저장한다.
// 제품번호는 1, 제품명은 컴퓨터라고 저장.
p1.number = 1;
p1.name = "컴퓨터";
// 제품번호는 2, 제품명 TV도 만든다.
Product p2 = new Product();
p2.number = 2;
p2.name = "TV";
4. new 연산자를 이용한 객체 생성 시, 메모리와의 관계
new 연산자를 사용했을 때, 메모리의 Heap 영역에 공간을 확보해 객체를 생성하고,
객체 변수 p는 Stack 영역에 존재한다.
하지만 객체의 실체는 Heap 영역에 있기 때문에, p는 Heap 영역의 객체를 참조한다.
4. static 키워드를 사용했을 때, 메모리와의 관계
클래스의 객체들은 서로 독립적이지만, 객체들이 변수나 메소드를 공유하게 만들 수도 있다.
이를 static(정적) 변수와 static 메소드라고 하며, 둘을 합쳐 정적멤버라고 한다
static 키워드를 통해 생성된 정적멤버들은 Heap 영역이 아닌 Static 영역에 할당된다.
Static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는
장점을 가지지만 Garbage Collector의 관리 영역 밖에 존재하기에 Static영역에 있는 멤버들은
프로그램의 종료시까지 메모리가 할당된 채로 존재하게 된다.
그렇기에 Static을 너무 남발하게 되면 만들고자 하는 시스템 성능에 악영향을 줄 수 있다.
샘플 코드
public class StaticVar {
// static 변수
static int count = 1;
// 멤버 변수 => 자기 자신만의 데이터
int data = 0;
void print() {
System.out.println("count : " + count);
System.out.println("data : " + data);
}
}
// 메인
public class StaticMain {
public static void main(String[] args) {
StaticVar sv1 = new StaticVar();
sv1.print();
StaticVar sv2 = new StaticVar();
sv2.print();
// static 변수는, 클래스 이름을 쓰고 액세스한다.
StaticVar.count = 3;
sv1.print();
sv2.print();
sv1.data = 10;
sv2.data = 500;
sv1.print();
sv2.print();
}
}
'Java' 카테고리의 다른 글
Java - 생성자(Constructor) (0) | 2023.01.19 |
---|---|
Java - 메소드 오버로딩(Method Overloading) (0) | 2023.01.18 |
Java - 함수(function)를 정의하는 방법 (0) | 2023.01.18 |
Java - 배열(array)의 생성과 데이터 액세스 (0) | 2023.01.18 |
Java - 반복문 사용 방법 (for / while) (0) | 2023.01.18 |