가쟤의 해변일기 🐳

풀스택 과정 3일차 본문

풀스택과정

풀스택 과정 3일차

바닷가쟤 2025. 4. 11. 17:30
💡 2025. 04. 11 수업 이슈

- 객체 생성의 원리와 Memory Allocation ⭐
- DataType
- Constructor ⭐

 

클래스 - 표준화, 일반화 하는 능력이 중요하다고 한다.

Clothing t = new Shirt();는 Shirt의 부모클래스로 업캐스팅 하는 것이므로

추상적으로 포괄하는 객체를 생성할 수 있다.


생성자 (Constructor)

Shirt t = new Shirt() ← 이 부분이 생성자이다.

생성자는 객체가 생성될 때마다 동작하는 것이다.

메소드 정의 = 메소드 선언부 + 메소드 구현부

 

값을 주입하는 통로는 단 두 가지이다.

명시적 생성자
setter

이 둘의 차이는 라이프사이클이다.

 

명시적 생성자를 생성하고 값을 주입하면 라이프사이클이 끝난다.

setter로 값을 주입하면 다른 라이프사이클을 갖는다.

  1. 하나의 클래스에는 반드시 하나 이상의 생성자가 존재한다.
  2. 개발자가 명시적 생성자를 넣어주면 그때는 기본 생성자가 자동으로 들어가지 않는다. 필요하면 이때는 직접 기본생성자를 정의해야 한다.
  3. 명시적 생성자가 하는 일은 필드초기화이다.
  4. 기본 생성자는 아무일도 하지 않는다. 단지 타입만 맞춰줄 뿐이다.
  5. 명시적 생성자는 setter 메소드와 동일한 작업을 하지만 리턴 타입이 없기 때문에 메소드는 아니다.
  6. 생성자는 클래스의 구성요소 즉, 멤버가 아니기 때문에 메모리에 올라가는 대상이 아니다.
  7. 생성자 앞의 Access Modifier(접근 지정자)는 class를 따라간다.

Data Type

 

Java나 C에서는 꼭 변수 타입을 지정해줘야 한다. ➡ 정적 값 할당

반면 Python이나 JS는 자동으로 변수 타입을 정해준다. ➡ 동적 값 할당

자바의 기본형 데이터타입이다.

정수에서는 int가 기본, 실수에서는 double이 기본이다.

 

package com.edu.datatype.test;

public class DataTypeTest {
	public static void main(String[] args) {
		byte a = 127;
		System.out.println("a==>" + a);
	}
}

 

여기서 변수 a는 로컬 변수 이다.

class 바로 밑이 아닌 메소드 안에 선언되었기 때문이다 !! ㅇㅁㅇ

 

package com.edu.datatype.test;

public class DataTypeTest {
	int c;
	
	public static void main(String[] args) {
		c = 100;
	}
}

 

이렇게 하면 에러가 난다.

int c; 는 인스턴스 변수 즉, 객체를 만들어야만 존재하는 변수이다.

class에서 선언된 것은 호출을 해야만 사용할 수 있기 때문이다.

 

package com.edu.datatype.test;

public class DataTypeTest {
	int c;
	
	public static void main(String[] args) {
		DataTypeTest test = new DataTypeTest();
		test.c = 100;
	}
}

 

굳이 하자면 이렇게 할 수 있다.

long, float, double 타입은 값 뒤에 무조건 데이터 타입이 생략되어져 있다.

값비교 이전에 타입을 먼저 비교한다.

float salary = 300.34

➡ float salary = 300.34f;

L, F, D (대소문자 가능)을 뒤에 붙이면 된다.

 

package com.edu.datatype.test;

public class DataTypeTest {
	int c;
	
	public static void main(String[] args) {
		short x, y, c;
		x = 1;
		y = 2;
		c = x + y;
	}
}

 

이게 에러가 난다…!

실제값 1 + 2면 에러가 안 나는데,

실제값이 아니기 때문에 타입 비교가 안 된다.

사칙 연산이 적용되면 int로 형변환되기 때문에 int가 short에 들어갈 수 없다. 

사칙 연산 ➡ 승격

(short) (x * y) (short) x * (short) y 를 해주면 된다.


메모리 할당

  1. Shirt s;를 하면 JVM의 stack 부분s라는 이름(변수명)으로 공간이 할당된다.
  2. s = new Shirt(”옷”, 100, false);를 하면 힙 영역에 필드 변수의 공간이 잡히고, 기본값(디폴트값)으로 할당된다(⭐묵시적 초기화무조건 진행됨). → null, 0, false가 기본값으로 들어감.
  3. 힙 영역에 잡힌 곳에 주소값이 잡힌다.
  4. 힙 영역에 잡힌 객체의 주소값이 만약 1007이라고한다면, s = 1007 주소값이 할당된다.
  5. 스택에 있는 s에서 힙에 있는 객체를 가리키는 참조가 일어난다. (reference value - 참조변수)
  6. 생성자 구동에 의한 초기화가 이루어진다.(명시적 초기화의 경우에만)

기본 생성자, 명시적 생성자 모두 묵시적 초기화반드시 일어나고, 명시적 생성자는 그 후에 값 초기화가 진행된다.

 

 

이 그림은 코드를 짜고 내가 만든거다.

재밋군.

728x90