📌 자바에서 추상화를 하는 방법을 구체적으로 알아보자.
📌 클래스 변수와 인스턴스 변수의 차이점을 힙메모리를 통해 알아보자.
추상화는 중요한 특징을 찾아내 간단하게 표현하는 것이다.
🤔 그러면 어떤 기준으로 특징을 삼아야할까??
애플리케이션의 경계, 컨텍스트를 중심으로 추상화를 해야한다.
즉, 관심영역에서 의미있는 속성과 행위를 가지고 추상화를 해야한다. 🟰 모델링
👉 아르바이트생 클래스에는 학점 속성이 들어가지 않아도 된다.
🙆 목적에 맞게 관심있는 특성만을 추출해서 표현하는 것이다.
🙅 실제 사물을 정확히 복제하는 것
- 클래스 : 분류된 유목(?), 동일한 속성과 메서드를 가진 객체들를 총칭하는 개념
- 객체 : 실제 값을 가지는 유일무이한 사물
객체는 실제 값을 가질 수 있다.
코드로 조금 더 살펴보자면, 학생이라는 클래스가 있을 때
학생 서현 = new 학생();
// 새로운 학생 객체를 만들어서 서현이라는 변수에 넣는다.
초반에는 아무것도 모르니까 일단 new 뒤에 오는 클래스와 앞의 클래스가 동일하다고 생각하고 넘어갔다. 그래서 이후 다형성을 공부하면서 이 부분이 정말 헷갈렸던 기억이 있다. ㅜ
➕ 객체와 인스턴스는 동일한 뜻이지만 코드상에서는 인스턴스라는 말을 더 자주 사용한다.
특히 new
라는 예약어를 통해서 메모리에 올라간 객체 표현했을 떄 인스턴스라고 표현한다.
클래스를 표현하는 다이어그램이 있다. 더 찾아보자.
클래스 변수나 클래스 메서드 즉 static
예약어로 선언된 경우 밑줄로 표현한다.
코드와 T메모리를 그려서 설명했다. 그래서 내가 헷갈리는 것과 핵심적인 것만 짚어보자면
java.lang
과 import
문의 패키지, 모든 클래스를 스태틱 영역에 놓는다. 🤔 그러면 객체 멤버의 저장영역은 어디에 있을까?
Mouse jerry = new Mouse();
jerry 변수는 main 스택 프레임에 올라가지만 인스턴스는 힙 메모리에 올라가고, jerry 변수에는 힙 메모리의 주소 값이 들어간다. 🟰 인스턴스를 참조한다.
⭐ 내가 꼭 기억했으면 하는 것!
📌 클래스는 실행되기 전 스태틱 영역에 할당된다.
따라서 클래스 메서드인 정적 메서드와 클래스 변수인 정적 변수 또한 프로그램 실행 전 메모리공간을 차지한다.
package OOP03.abstraction01;
/*
T메모리의 스태틱 영역에 할당 될 때,
Mouse의 변수들은 static로 선언 ❌
객체 변수, 인스턴스 변수임
*/
public class Mouse {
public String name;
public int age;
public int countOfTail;
public void sing() {
System.out.println(name + ": 찍찍!!🐭" );
}
}
package OOP03.abstraction01;
/*
1. 모든 자바프로그램에 포함된 “java.lang”을 스태틱 영역에 놓는다.
2. 프로그램 상의 모든 클래스를 T 메모리의 스태틱 영역에 배치한다. : Mouse , MouseDriver
- Mouse 영역의 변수 :
Static ❌ -> 클래스 변수가 아닌 객체 변수, 즉 인스턴스 변수이다.
따라서 스태틱 영역에 저장 공간 할당 안됨.
*/
public class MouseDriver {
//메서드는 스택 영역에 스택프레임으로 할당
public static void main(String[] args) { //static ⭕ -> 즉 클래스 메서드
//main 스택 프레임의 변수 저장공간에 mickey 할당
Mouse mickey = new Mouse();
/*
1. mickey의 타입은 Mouse
2. Mouse 객체를 만드는 생성자
3. 새로운 객체의 ⭐주소를 ⭐객체 참조 변수 mickey에 대입
*/
mickey.name = "미키";
mickey.age = 8;
mickey.countOfTail = 1;
mickey.sing();
mickey = null; //이때 힙메모리에 있는 인스턴스를 참조하는 변수가 사라짐
Mouse jerry = new Mouse();
jerry.name = "제리";
jerry.age = 6;
jerry.countOfTail = 1;
jerry.sing();
}
}
스태틱 : ⭐ 메인 메서드가 실행되기 전 할당되어서, 메인 메서드가 종료된 후에 사라진다.
스택 : 선입선출어쩌구
힙 : 대용량 자료를 저장할 수 있도록 메모리를 사용하는 방식
계속해서 강조하지만 클래스 멤버는 메인 메서드 실행 전에 올라간다.
클래스 변수 = 정적 변수 = 스태틱 변수
인스턴스 변수 = 객체 변수
클래스 변수는 모든 클래스가 동일하게 갖는 속성이나, ⭐객체를 생성하지 않고도 사용하고 싶을 때 적절하다.
정적 메서드는 메인 메서드 실행 전에 올라간다. 따라서 객체 변수를 사용하지 않고도 사용할 수 있다.
😎 main 메서드를 생각해보자. 아무런 객체를 생성하지 않고도 실행할 수 있다.
😎 인스턴스를 만들지 않고서도 사용하고 싶을 때, Math
클래스를 잘 생각해보자~!
그 동안 메모리의 구조가 헷갈린 적이 많았는 데 단번에 이해가 가서 뭔가 후련하다.
클래스의 변수와 메서드의 적절한 활용 방법에 대해서도 생각할 수 있게 되었다.
클래스 멤버는?? 인스턴스를 메모리에 올리지 않고도 사용하고 싶을 때
로아 똥멍청이가 나를 물라한다. 나도 이제 너 싫음 흥흥 퉤퉤