[자바와 객체 지향 그리고 스프링] 3- 추상화: 모델링

코린이서현이·2024년 1월 1일
0

🤔들어가면서🤔

🎯 목표

📌 자바에서 추상화를 하는 방법을 구체적으로 알아보자.
📌 클래스 변수와 인스턴스 변수의 차이점을 힙메모리를 통해 알아보자.

📌 추상화: 모델링

추상화는 중요한 특징을 찾아내 간단하게 표현하는 것이다.
🤔 그러면 어떤 기준으로 특징을 삼아야할까??

객체지향의 추상화란

애플리케이션의 경계, 컨텍스트를 중심으로 추상화를 해야한다.
즉, 관심영역에서 의미있는 속성과 행위를 가지고 추상화를 해야한다. 🟰 모델링

학생으로서의 인간 vs 알바로서의 인간

  • 학생으로의 인간은 학점이 중요한 속성이지만, 알바로서는 아니다.
  • 알바로의 인간은 계좌가 중요한 속성이지만 학생으로서는 아니다. (맞을수도?)

👉 아르바이트생 클래스에는 학점 속성이 들어가지 않아도 된다.

모델링

🙆 목적에 맞게 관심있는 특성만을 추출해서 표현하는 것이다.
🙅‍ 실제 사물을 정확히 복제하는 것

클래스와 객체

- 클래스 : 분류된 유목(?), 동일한 속성과 메서드를 가진 객체들를 총칭하는 개념 
- 객체 : 실제 값을 가지는 유일무이한 사물

객체는 실제 값을 가질 수 있다.

  • 진OO은 01년생이다. : ⭕
  • 사람은 01년생이다 : ❌

코드로 조금 더 살펴보자면, 학생이라는 클래스가 있을 때

학생 서현 = new 학생(); 
// 새로운 학생 객체를 만들어서 서현이라는 변수에 넣는다. 
  • 첫번째 학생 : 객체 참조 변수의 타입
  • 서현 : 객체가 저장된 메모리의 주소를 참조하는 객체 참조 변수
  • 두번째 학생 : 실제 만드는(?) 객체
  • () : 생성하는 메서드

초반에는 아무것도 모르니까 일단 new 뒤에 오는 클래스와 앞의 클래스가 동일하다고 생각하고 넘어갔다. 그래서 이후 다형성을 공부하면서 이 부분이 정말 헷갈렸던 기억이 있다. ㅜ

➕ 객체와 인스턴스는 동일한 뜻이지만 코드상에서는 인스턴스라는 말을 더 자주 사용한다.
특히 new라는 예약어를 통해서 메모리에 올라간 객체 표현했을 떄 인스턴스라고 표현한다.

UML 다이어그램

클래스를 표현하는 다이어그램이 있다. 더 찾아보자.
클래스 변수나 클래스 메서드 즉 static예약어로 선언된 경우 밑줄로 표현한다.

자세히 알아보기

📌 추상화와 T 메모리

코드로 살펴보기

코드와 T메모리를 그려서 설명했다. 그래서 내가 헷갈리는 것과 핵심적인 것만 짚어보자면

  • main 메서드가 실행되기전에 스태틱 영역에 java.langimport문의 패키지, 모든 클래스를 스태틱 영역에 놓는다.
  • 스태틱에 올라간 클래스의 클래스 멤버는 저장 영역을 가지고, 객체 멤버는 저장영역을 따로 가지지 않는다. 🤔 그러면 객체 멤버의 저장영역은 어디에 있을까?
  • main 메서드는 스택 프레임을 가지고 그 스택 프레임에 변수의 저장 공간이 할당된다.
  • 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();

  }
}

스태틱 vs 스택 vs 힙

스태틱 : ⭐ 메인 메서드가 실행되기 전 할당되어서, 메인 메서드가 종료된 후에 사라진다.
스택 : 선입선출어쩌구
: 대용량 자료를 저장할 수 있도록 메모리를 사용하는 방식

클래스 멤버와 인스턴스 멤버

계속해서 강조하지만 클래스 멤버는 메인 메서드 실행 전에 올라간다.

클래스 변수와 인스턴스 변수

클래스 변수 = 정적 변수 = 스태틱 변수
인스턴스 변수 = 객체 변수

클래스 변수는 모든 클래스가 동일하게 갖는 속성이나, ⭐객체를 생성하지 않고도 사용하고 싶을 때 적절하다.

🤔 스태틱메서드(정적메서드)는 언제 사용할 수 있을까? :

정적 메서드는 메인 메서드 실행 전에 올라간다. 따라서 객체 변수를 사용하지 않고도 사용할 수 있다.

😎 main 메서드를 생각해보자. 아무런 객체를 생성하지 않고도 실행할 수 있다.

클래스 멤버가 적절한 상황

😎 인스턴스를 만들지 않고서도 사용하고 싶을 때, Math클래스를 잘 생각해보자~!

😢마무리하면서😢

그 동안 메모리의 구조가 헷갈린 적이 많았는 데 단번에 이해가 가서 뭔가 후련하다.
클래스의 변수와 메서드의 적절한 활용 방법에 대해서도 생각할 수 있게 되었다.

클래스 멤버는?? 인스턴스를 메모리에 올리지 않고도 사용하고 싶을 때

로아 똥멍청이가 나를 물라한다. 나도 이제 너 싫음 흥흥 퉤퉤
profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글