일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 반효경
- SDK
- 운영체제와 정보기술의 원리
- 프로세스 주소 공간
- 인터럽트
- 쉬운 코드
- 네트워크
- 쉬운코드
- 개발남노씨
- concurrency control
- recoverability
- 코딩테스트 [ ALL IN ONE ]
- 운영체제
- 커널 동기화
- 김영한
- SQL
- 시그널 핸들러
- 온디바이스AI
- 갤럭시 S24
- 백엔드
- 시스템프로그래밍
- 데이터베이스
- Git
- Extendable hashing
- 코딩애플
- 트랜잭션
- BreadcrumbsComputer-Networking_A-Top-Down-Approach
- vite
- CPU 스케줄링
- B tree 데이터삽입
- Today
- Total
티끌모아 태산
2. 기본형과 참조형 본문
✅기본형과 참조형
자바에서 참조형을 명확하게 이해하는 것은 매우 중요하다.
- 기본형(Primitive Type): int, long, double, boolean 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입이다.
- 참조형(Reference Type): Student student1, int[] students 와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형이라고 한다. 참조형은 객체 또는 배열에 사용된다.
쉽게 말해, 기본형 변수에는 직접 사용할 수 있는 값이 들어있지만 참조형 변수에는 위치(참조값)가 들어가 있다. 그렇기 때문에 참조형 변수를 통해서 뭔가 수행하기 위해서는 결국 참조값을 통해 해당 위치로 이동해야 한다.
// 기본형 대입, 사칙 연산 가능
int a = 10;
int b = 20;
// 참조형 대입, 사칙 연산 불가능
Student s1 = new Student();
Student s2 = new Student();
자바는 항상 변수의 값을 복사해서 대입한다. 위 코드에서도 참조형의 경우 실제 사용하는 객체가 아니라 객체의 위치를 가리키는 참조값만 복사된다.
dataA 변수는 Data 클래스를 통해서 만들었기 때문에 참조형이다. 이 변수는 Data 타입의 객체의 참조값을 저장한다. Data객체를 생성하고, 객체의 위치를 가리키는 참조값을 dataA에 저장한다. 그리고 이 참조값을 사용해서 객체의 value변수에 10을 저장한다.
값을 복사해서 전달하기 때문에 dataA와 dataB에 들어있는 참조값을 같다. 따라서 둘다 같은 x001 Data 인스턴스를 가리킨다.
변수와 메서드
변수는 클래스 변수, 인스턴스 변수, 지역 변수 모두 세 종류가 있고, 이들을 구분하는 요소는 '변수의 선언 위치' 이다.
- 인스턴스 변수: 클래스 영역에 선언. 클래스의 인스턴스를 생성할 때 즉, 인스턴스가 생성되었을 때 만들어진다. 따라서 인스턴스 변수를 사용하기 위해서는 먼저, 인스턴스를 생성해야한다. 인스턴스는 독립적인 저장공간을 가지므로 서로 다른값을 가질 수 있다. 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스 변수로 선언
- 클래스 변수: 인스턴스 변수 앞에 static을 붙이면 된다. 클래스 변수는 공통된 저장공간(변수)를 공유하게 된다. 클래스 변수는 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있다는 특징이 있다. '클래스이름.클래스변수' 와같은 형식으로 사용
- 지역 변수: 메서드 내에서 선언되어 메서드 내에서만 사용가능하다. 메서드가 종료되면 소멸되어 사라진다.
인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.
메서드는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다. 메서드의 작업 수행 결과(출력)인 반환값의 타입을 적는다. 반환 값이 없는 경우는 반환 타입으로 'void'를 적어야 한다. 메서드가 호출되면 지금까지 실행 중이던 메서드는 실행을 잠시 멈추고 호출된 메서드의 문장들이 실행된다. 호출된 메서드의 작업이 모두 끝나면, 다시 호출한 메서드로 돌아와 이후의 문장들을 실행. return문은 현재 실행중인 메서드를 종료하고 호출한 메서드로 되돌아 간다.
- 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.
- 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거된다.
- 호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드이다.
- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.
기본형 매개변수 vs 참조형 매개변수
- 기본형(Primitive Type): 변수의 값을 읽기만 할 수 있다.(only read)
- 참조형(Reference Type): 변수의 값을 읽고 변경할 수 있다. (read & write)
public class MethodChange2 {
public static void main(String[] args) {
Data dataA = new Data();
dataA.value = 10;
System.out.println("메서드 호출 후: dataA.value = " + dataA.value);
System.out.println("dataA = " + dataA);
changeReference(dataA);
System.out.println("메서드 호출 후: dataA.value = " + dataA.value);
}
public static void changeReference(Data dataX) {
System.out.println("dataX = " + dataX);
dataX.value = 20;
}
}
메서드를 호출할 때 매개변수 dataX에 변수 dataA의 값을 전달한다. 그러면 이 코드는 다음과 같이 해석할 수 있다.
Data dataX = dataA
그러면 dataX에 x001의 값이 복사되어 전달된다. 즉, 참조값이 전달됐기 때문에 dataA와 dataX 둘다 같은 참조값인 x001을 갖게 되고 dataX를 통해서도 x001에 있는 Data인스턴스에 접근할 수 있다. 따라서 읽고 변경할 수 있다.
메서드 안에서 dataX.vale = 20으로 새로운 값을 대입한다. 그리고 참조값을 통해 x001에 있는 인스턴스에 접근하고 그 안에 있는 value의 값을 20으로 변경한다. dataA와 dataX 모두 같은 x001 인스턴스를 참조하기 때문에 dataA.value와 dataX.value는 둘다 20이라는 값을 갖게 된다.
대원칙: 자바는 항상 변수의 값을 복사해서 대입한다.
기본형, 참조형 모두 항상 변수에 있는 값을 보가해서 전달한다. 기본형이면 변수에 들어 있는 실제 사용하는 값을 복사해서 대입하고, 참조형이면 변수에 들어 있는 참조값을 복사해서 대입한다.
기본형 vs 참조형 - 기본
- 기본형을 제외한 나머지 변수는 모두 참조형이다. 클래스와 배열을 다루는 변수는, 참조형이다. (*String)
- 기본형은 값을 직접 저장하지만, 참조형은 참조(주소)를 저장한다.
- 기본형 변수는 산술 연산을 수행하지만, 참조형 변수는 산술 연살을 수행할 수 없다.
- 기본형 변수는 null을 할당할 수 없지만, 참조형 변수는 null을 할당 할 수 있다.
null을 할당하면 어떤 인스턴스도 참조하지 않게 된다. 그렇기 때문에 인스턴스에 접근할 방법이 없다. 아무도 참조하지 않는 인스턴스는 메모리 용량만 차리할 뿐이기 때문에 가비지 컬렉션이 해당 인스턴스를 자동으로 메모리에서 제거해 준다.
기본형 vs 참조형 - 대입
- 기본형과 참조형 모두 대입시 변수 안에 있는 값을 복사해서 전달한다.
- 이때, 참조형은 참조값을 복사해서 전달하는 것이지 인스턴스 자체를 복사해서 전달하는 것이 아니다!
⭐기본형 vs 참조형 - 메서드 호출
- 메서드 호출시 기본형은 메서드 내부에서 매개변수(파라미터)의 값을 변경해도 호출자의 변수 값에는 영향이 없다.
- 반면에 참조형은 메서드 내부에서 매개변수로 전달된 객체의 멤버 변수를 변경하면, 호출자의 객체도 변경된다.
'백엔드 > JAVA' 카테고리의 다른 글
10. 다형성(1) (0) | 2024.05.31 |
---|---|
9. 상속 (0) | 2024.05.30 |
1. 클래스와 데이터 (0) | 2024.03.04 |