본문 바로가기
Java 웹 프로그래밍

[백기선 온라인 스터디] 2주차 과제

by irerin07 2021. 1. 27.
728x90

Primitive Type

원시타입 혹은 기본 타입이라 한다.

- 값을 할당할 때 변수의 주소값에 값이 그 자체로 저장되는 Data Type -> 인스턴스 생성을 하지 않는다.

- Stack 영역에 저장된다.

- Primitive를 Object로 감싸는 Wrapper Class 제공

 

정수타입

- byte 8bit

- short 16bit

- int 32bit

- long 64bit

 

실수타입

- float 32bit

- double 64bit

 

논리타입

- boolean 8bit

 

Type Conversion

- Widening = int -> long 가능

- Narrowing = int -> byte 불가능. 다만 리터럴 value를 직접 넣으면 범위에 맞는다는 가정하에 가능하다. 혹은 강제 형번환을 사용한다.

 

Reference Type

- 실제 값이 저장되어 있는 곳의 위치를 저장한 값

- heap 영역에 할당되며 Reference type의 변수 주소 값에는 값이 아닌 heap 영역에 할당된 주소가 저장된다.

 

int a = 10;

fload b = 19.2;

Car c = new Car("Lexus");

Primitive type은 자바에 의해 이미 정의되어 있고 개발자가 추가적으로 정의할 수 없으며

Reference Type은 개발자가 정의할 수 있다.

 

== 비교

Primitive에서는 값을 비교하지만

Reference Type에서는 참조 주소를 비교한다.

 

Primitive == Reference 비교시엔 값을 비교

 

Person p1 = new Person("Sam");
Person p2 = p1;

p1.name = "Park";

System.out.println(p1.name); // park
System.out.println(p2.name); // park

변수에 실제 값이 아닌 주소값이 저장된 -> Person instance가 공유된다. -> 얕은 복사 -> 하나의 인스턴스가 변경되면 나머지도 영향을 받게된다.

 

위를 방지하기 위해

1. 새로운 인스턴스 생성

2. 깊은 복사

- 깊은 복사를 사용할 Class에 implements Clonable 추가, clone 함수 재정의

 

Class Person implements Clonable {
	public Person clone() throws CloneNotSupportedException{
    	return (Person)super.clone();
    }
    String name;
    public Person(String name){
    	this.name = name;
    }
}

 

리터럴

- Data 그 자체 -> 값 표현 방식에 대해서 각 프로그래밍 언어의 컴파일러 혹은 인터프리터가 해석하는 방식의 명세이다

- 소스코드 내에서 직접 입력된 값

- 정수, 문자, 논리 리터럴

- 변수에 넣지만 변하지 않는 데이터

- 메소드 영역에 저장된다

 

int i = 2000; // 2000 자체가 하나의 리터럴

Member 객체의 클래스 필드 name

- Member 객체 생성 뒤, 인스턴스에 값을 넣을때 new Member();를 사용하는데 이는 리터럴이 아니다.

- new Member()의 값은 언제든 변경이 가능하기 때문

 

정수 리터럴

실수 리터럴

문자 리터럴

문자열 리터럴

논리 리터럴

 

변수 선언과 초기화

- 값을 다룰때, 혹은 여러번 사용하거나 값에 의미를 부여하는것

- Type은 변수에 저장되는 값의 종류, 변수이름은 메모리 주소에 붙여진 이름이다.

- Stack 영역에 메모리가 할당된다.

- 인스턴스 변수: 인스턴스 생성시마다 새로운 저장공간 할당. 클래스 내에서 선언

- 클래스 변수: 클래스가 메모리에 올라갈 떄 생성. Static 사용

- 지역 변수: 메소드 안에서 선언한 변수이며 선언만 하면 아무 값도 없는 상태이다.

 

int var1; //변수선언 후
var1 = 0; // 리터럴 입력(초기화)

int var2 = var1; //같은 타입 변수 입력

int var3 = 0; // 선언 동시 초기화
//참조타입은 new 사용해 초기화
List<Integer> a = new ArrayList<Integer>();
List<Integer> b = a;

Block 초기화

일반 초기화 Block - Class가 new를 통해 인스턴스 생성시 초기화

Static 초기화 Block - Jvm이 ClassLoader로 로딩 시점에 초기화

 

 

변수 스코프, 라이프타임

- Scope = 사용 범위

 

생명주기

- 인스턴스 변수 -> 객체 생성시 변수 생성. 인스턴스는 참조가 없을떄 GC가 처리. 인스턴스 변수 역시 소멸

- 매개변수 -> 메소드 호출시 생성되고 메소드 종료시 소멸

- 지역 변수 -> {} 

- 클래스 변수(정적변수)static -> 클래스 첫 호출시 생성, Java Application 종료시 소멸

 

배열

- 원시타입 혹은 참조타입으로 구성된 특별한 객체

- 0에서부터 시작하며 명시적으로 사이즈 결정이 가능하다

 

- 배열 역시 참조타입 -> 객체

 

- 배열 타입은 Class가 아니다. 하지만 배열의 instance들은 Object

- 즉 배열은 Clonable interface(객체 자신의 메모리를 복하)를 implement한다.

- 또한 Serializable을 구현한다. 즉 직렬화가 가능하다.

  - 자바 내부의 object나 data를 외부에서 사용하도록 바이트 형태로 변환

 

 

728x90