메모리 구조(큐,스택), 생성자, 기초/참조변수

이소연's avatar
Aug 03, 2024
메모리 구조(큐,스택), 생성자, 기초/참조변수
notion image
notion image
notion image
14번의 m2의 실행 후 “m2”로 됨.
notion image
notion image
notion image
notion image
notion image
매개변수(동전 투입구)
notion image
인수(동전)
notion image
💡
메서드는 호출할 때만 내부{ }가 실행된다.
ex) 밑의 사진에서 m1 호출 전에는 빨간상자 열리지x
메서드~~ 리턴 값이 호출문으로 바뀐다.
notion image
*메모리
static : 1번 띄울 수 있음.
시작 전 메모리에 띄우고 싶어(JVM이 , 우리가 못 함)
new
동적
 
💡
-매서드 안에 매서드는 못 넣음
-자바는 모든 것들이 class안에 넣어야 함.
💡
scope
notion image
notion image
BUT 생략가능 .같은 CLASS 내
notion image
static 붙어 있는 애들은 메인 전에 뜸
n1은 아직 안떠서
notion image
같이 뜸(힙하면서 )
 
 
*메서드가 열리면 큐가 열림
*큐는 데이터저장공간은 아님
notion image
notion image
notion image

[연습]]

package ex04.test; public class ScopeEx01 { int n1 = 1; static int n2 = 2; static void m1(){ int n1 = 10; System.out.println("m1 : " + n1); } void m2(){ System.out.println("m2 : " + n1); } //메인 시작전에 static에 n2변수와 m1 메서드가 로드 되어 있음. public static void main(String[] args) { System.out.println(1); m1(); System.out.println(2); } }
  1. 메모리 띄우기 전에 Stactic을 먼저 읽음 그리고 class 별로 구분하여 static 공간을 만듦
notion image
여기서 m1은 그냥 m1 이름만 뜨지 안에 { }실행되지는 않음
 
→ main 찾아 실행함
main Queue & main stack 열림
notion image
(stack 안의 main stack과 m1 stack은 서로 접근 안되고 외부에서도 이 정보에 접근하지 못함.)
 
19번 라인의 System.out.println(1); pop(cpu에 던짐)되고 20번 라인의 m1(); pop되고
m1 Queue 에서
9번 라인의 int n1 = 10; pop되고 10번 라인의 System.out.println("m1 : " + n1);pop되고
 
21번 라인의 System.out.println(2); pop됨.
→ static 외의 것들 실행됨
 
💡
stack에서 static 찾을 수 있음
그래서 static은 언제든 찾을 수 있지만 메모리를 많이 차지함.
💡
생명주기
stack <heap < static
stack은 실행될 때만 생겼다가 실행 끝나면 끝!
(그리고 m1 stack은 m1에서만 찾을 수 있음)
 
같은 scope는 같은 변수x.
 
메서드 시행되면 큐와 스택 시작
notion image
heap static 언제든 찾을 수 있음-v
heap은 원할 때 호출 가능
static은
 
package ex04.test; public class ScopeEx01 { int n1 = 1; static int n2 = 2; static void m1(){ int n5 = 10; System.out.println("m1 : " + n5); } void m2(){ System.out.println("m2 : " + n1); } //메인 시작전에 static에 n2변수와 m1 메서드가 로드 되어 있음. public static void main(String[] args) { System.out.println(1); m1(); System.out.println(2); ScopeEx01 sc = new ScopeEx01(); System.out.println(sc.n1); sc.m2(); } }
*Scope // 메모리 구조 // 위의 코드로 설명을 하자면…
ScopeEx01 (클래스)
  • static (n2 =2, m1(), main) ~main 시작 전에 1번 뜸
    • ⇒ 찾을 때는 클래스명. x (ex) ScopeEx01. n2)
      ⇒ 어디서든지 접근 가능하다.
  • Heap (n1 = 1, m2( ))~static 안 붙은 거 // new할 때 뜸
    • ⇒ Heap끼리는 같은 Scope여서 접근이 가능하다.
  • Stack (n5 = 10)~ 메서드 안에 거, 메서드 실행 시에 뜸
    • ⇒ 외부 접근 불가능(지역변수-v)
      ⇒ 같은 내부에서 접근 가능
       
       
 

기초변수/참조변수

 
  1. 기초변수(Primitive variable)
    1. : 사이즈가 정해져 있는 것 ⇒ JVM이 땅을 미리 설계 가능하다.
      ex) int, float, char 등
      ex) 주민등록번호 → 사이즈가 13자리로 fix →미리 설계 가능
 
  1. 참조변수(reference variable)
    1. : 사이즈를 알 수 없을 때 ⇒ 그래서 메모리의 주소(Pointer)로 저장
      ex) 사람의 이름 → 이름이 2자,3자,4자 등 다양할 수 있음
 
EX) 채팅 : 자료형 설계(채팅메세지)
→(분석)하다 보니 자료들이 가장 긴 메세지가 10000자더라
→(Primitive 자료형으로 하면) : char 10000개(20000byte) → 메세지의 길이에 따라 너무 공간이 낭비가 될 수 있고 어떤 경우 모자랄 수 있다.
→(reference 자료형으로 하면) : n=*1000 → 1000번지에 값이 있다.
 
 
💡
tip) 자료가 가변적일 경우, 지하철 사물함을 떠올리면, 크기가 다른 것도 있지만 보통 크기가 정해져 있음 → 그렇지만 5000억을 그 곳에 저장한다고 하면 그 곳에 다 넣지 못함. 또한 가변적이라면? → 그래서 그 보관함에 대신 그 5000억이 있는 주소값을 넣어놓는 것. 예를 들어 강원도 정선 같이. 그러면 자료가 가변적이라도 다룰 수 있음.
💡
찾을 때 값이 바로 찾아지는 게 주소를 찾아지는 것보다 당연히 빠르다.
 
notion image
 
 
 
notion image
notion image
notion image
sum을 바꾼다고 num이 바뀌지 않음.값이 넘어감.
notion image
notion image
notion image
파라메터도 스택에 실행 시 보임

1차 개발/2차 개발(우리가 주로 하는 것)

test 시에 최소 여러 번 해봐야 함. 여러 값들을 넣어봐야 함.
notion image
 

메서드 오버로딩

notion image
 
매개변수가 달라야 함.(개수나 변수가 다르거나.)-v
 

생성자

: 객체가 생성될 때 초기화하는 특수한 메소드
1) 매개 변수 없는 생성자(기본 생성자)
: 개발자가 선언x→ 자바컴파일러가 자동 만듦
2) 매개 변수 있는 생성자
💡
생성자를 하나라도 선언하면, 컴파일러는 기본 생성자 추가x ex) 헬스장 수건
 
notion image
notion image
this. ⇒ heap을 나타냄
 
notion image
 
💡
alt + insert (이 공간에 들어오는 게 맞나 잘 보고 하기.)
notion image
notion image
 
 
💡
shift + 방향키 (블럭 선택)
package ex04; //설계도 class People{ String name; int power; int hp; //객체 초기화 - > 생성자 public People(String name, int power) { this.name = name; this.power = power; this.hp = 100; } //행위 (메서드)-시간이 흐름에 따라 변하는 것-v public void upgradePower(){ this.power++; } @Override public String toString() { return "People{" + "name='" + name + '\'' + ", power=" + power + ", hp=" + hp + '}'; } } public class PersonEx01 { public static void main(String[] args) { People p1 = new People("티모",10); System.out.println(p1); p1.upgradePower(); System.out.println(p1); } }
notion image
💡
push 전 commit 수정시 git commit --amend -m"생성자 공부”
 
notion image
⇒ 자동완성하면 import가 뜸
 
+) person2(); 생성자. 아무것도 안 적으면 디폴트,
notion image

복습

package ex04.test; /** * 1. 자료형 * 2. 조건문 * 3. 반복문 * 4. static, heap, stack * 5. 클래스, 메서드 * 6. 생성자 오버로딩, 메서드 오버로딩 * 7. 접근제어자 */ class Bird { // 클래스 , 오브젝트(가능성) // 상태 : 무게, 색상 double weight; String color; Bird(double weight, String color) { // 파라미터 this.weight = weight; this.color = color; } public void eat() { this.weight++; } } public class PracticeEx01 { public static void main(String[] args) { Bird b1 = new Bird(5.5, "빨강"); // 인스턴스, 오브젝트(객체) Bird b2 = new Bird(5.0, "하얀"); b1.eat(); // 행위 (메서드) System.out.println(b1.weight); System.out.println(b2.weight); } }
* 그동안 배운 것들 1.자료형 1)완성형 표(한글 2바이트)? : 완성된 표를 사용해서 더 추가할려면 시간 걸림 ex) 뷁 euc-kr 2) so. 그래서 utf-8 조합형으로 사용 -한글- 각(ㄱ 1b, ㅏ1b, ㄱ 1byte) -a전송 ->1byte, 가 전송 ->3byte, 이모지-> 4byte -문자에 따라 가변적 -마리아db -int -varchar(20)_가변-> 안녕 6byte -> 14byte남으면 자동으로 줄임(사이즈를 딱 맞게 연산을 하여 줄임) ex)채팅 ~자바에서는 string 씀 -> 레퍼런스 자료 -char(20)_고정-> 안녕 6byte-> 14byte남으면 그대로 둠.(연산 하지않음-> 속도가 다름) new가 가능한 모든 것 -오브젝트 클래스, 오브젝트(존재할 수 있는 것) >> new >> 오브젝트, 인스턴스(존재하고 있음) 2.조건문 3.반복문 4.static, heap, stack 5.클래스, 메서드 6.생성자 오버로딩, 메서드 오버로딩 7.접근제어자
notion image
 
 
*연습(bank app만들기)
-비즈니스) 고객이 계좌이체를 할 수 있는 서비스를 만드는 것.
notion image
모든 오브젝트는 고유번호가 있으면 좋다. → heap에 띄었을 때 중복을 빠르게 피할 수있다.
notion image
notion image
notion image
notion image
기본제어자 → 같은 패키지에서만 접근가능
return; : 프로그램 종료. 메인의 큐, 메서드 종료 / return은 메서드를 종료시킴
조건문은 걸러내기가 중요. 비정상적인 걸 넣어 걸러내는 게 코드가 깨끗해 짐.
 
일의 최소단위 =트랜잭션 // 상대적
하나라도 실패하면 프로그램이 실행되면 안되는 것
ex) 아들 밥먹기. 설거지
ex)출금 - 출금 // 입금 -입금 // 이체 - 출/입 둘 다
 
메서드는 하나의 일만 한다.
 
이 두 개는 한번에 일어나야 함. 따로 하면 실수할 확률 있음
notion image
상태변경 class 로직들 묶은 거 서비스(트랜잭션)-v
 
하나의 트랜잭션
notion image
 
 
Share article

Coding's note