[혼공자] chapter05 - 참조 타입

나봉·2025년 1월 22일
0

13기 혼공자

목록 보기
7/14

05-1 참조 타입과 참조 변수

자바의 데이터 타입

1. 기본 타입

  • 정수 타입: byte, char, short, int, long
  • 실수 타입: float, double
  • 논리 타입: boolean
    2. 참조 타입
  • 배열 타입
  • 열거 타입
  • 클래스
  • 인터페이스

기본 타입과 참조 타입

  • 기본 타입: 기본 타입인 변수는 실제 값을 변수 안에 저장
  • 참조 타입: 메모리의 번지를 변수 안에 저장, 번지를 통해 객체를 참조
	// 기본 타입 변수
	int age = 25;
    int price = 100.5;
    // 참조 타입 변수
    String name = "홍길동";
    String hobby = "수영";

기본 타입인 age와 price는 직접 값을 저장하고,
참조 타입인 String클래스의 name과 hobby는 힙 영역에 String 객체 번지 값을 저장

메모리 사용 영역

1. 메서드 영역

  • JVM이 시작할 때 생성, 모든 스레드가 공유하는 영역

  • 정적 필드(static filed)와 상수(constant), 메서드 코드, 생성자(constructor)코드 등을 분류해서 저장

2. 힙 영역

  • 객체와 배열이 생성되는 영역

  • 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조

  • 참조하는 변수나 필드가 없다면 가비지 콜렉터(Garbage Collector)를 실행시켜 자동으로 제거

3. JVM 스택 영역

  • 메서드를 호출할 때 마다 프레임을 추가(push)하고 메서드가 종료되면 해당 프레임을 제거(pop)

  • 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거

참조 변수의 ==, !=연산

  • 참조 타입의 변수의 값은 힙 영역의 객체 주소이므로 ==, != 연산은 번지 값을 비교하는 것
    => 동일한 변수를 갖고 있다는 것은 동일한 객체를 참조하는 것

null과 NullPointerException

  • 참조 타입 변수는 힙영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있음
    => null 값도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성
    => 참조되지 않은 객체Gabage Collector를 구동시켜 메모리에서 자동 제거

  • 예외(Exction) : 프로그램 실행 도중 발생하는 오류 / Error : 하드웨어, OS에서 발생
    => NullPointerException : 참조 타입 변수를 잘못 사용하면 발생

String 타입

  • 문자열을 String 변수에 저장 , "(큰따옴표)로 감싼 문자열 리터럴을 대입
  • 문자열은 String 객체로 생성되고 변수는 String 객체를 참조한다.
  • 문자열 리터럴이 동일하다면 같은 String 객체를 참조한다.
  • new 연산자 : 힙 영역에 새로운 객체를 만들 때 사용하는 연산자
        // 방법1
        String 변수;
        변수 = "문자열";

        // 방법2
        String 변수 = "문자열";

        // new 연산자
        // name1과 name2는 동일한 객체를 참조
        String name1 = "홍길동";
        String name2 = "홍길동";
        // name3는 name1,name2와는 다른 갹채를 참조
        String name3 = new String("홍길동");

        // 문자열 비교
        String strVar1 = "홍길동";
		String strVar2 = "홍길동";

		if(strVar1 == strVar2) {
			System.out.println("strVar1과 strVar2는 참조가 같음");
		} else {
			System.out.println("strVar1과 strVar2는 참조가 다름");
		}

		if (strVar1.equals(strVar2)) {
			System.out.println("strVar1과 strVar2는 문자열이 같음");
		}
        
        // new 연산자 비교
        String strVar3 = new String("홍길동");
		String strVar4 = new String("홍길동");
		
		if(strVar3 == strVar4) {
			System.out.println("strVar3과 strVar4는 참조가 같음");
		} else {
			System.out.println("strVar3과 strVar4는 참조가 다름");
		}
		
		if (strVar3.equals(strVar4)) {
			System.out.println("strVar3과 strVar4는 문자열이 같음");
		}

05-2 배열

  • 같은 데이터를 연속된 공간에 나열하고 각 데이터에 인덱스를 부여한 자료구조

  • 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없다.

  • 배열도 참조 변수이므로 null값을 가질 수 있다.
    => null 값을 가진 상태에서 변수[인덱스]로 값을 읽거나 저장하면 NullPointerExction을 가진다.

배열 선언

	// 배열 선언 형식1
    int[] 변수;
    double[] 변수;
    
    // 배열 선언 형식2
	int 변수[]
    double 변수[]
    
    // 배열도 참조 변수이므로 null값으로  초기화 가능;
    int[] 변수 = null;

배열 생성

1. 값 목록으로 배열 생성

	String name = {"홍길동", "강감찬", "이순신"};
  • 인덱스는 0부터 시작이므로 name[0] = "홍길동"; / name[1] = "강감찬"; / name[2] = "이순신"; 이다.
    => name[1]을 바꾸고 싶다면 아래와 같이 대입 연산자를 사용한다.
	name[1] = "세종대왕";

2. new 연산자로 배열 생성

	타입[] 변수 = new 타입[길이];

	int[] array = new int[5];

타입별 배열의 초기값

  • 기본 타입(정수) : 0(long은 0L)
  • 기본 타입(실수) : 0.0(float은 0.0f)
  • 기본 타입(논리) : false
  • 참조 타입 : null

배열 길이

  • 배열에 저장할 수 있는 전체 항목의 개수
	배열 변수.length;
    
    int[] array = {10,  20, 30};
    int num = array.length; // 3

다차원 배열

  • 2차원 배열 : 행과 열로 구성
	int[][] scores1 = new int[2][3];
    
    int[][] scores2 = {{95, 80}, {92, 96}};
    int scores2 = scores2[0][0]; // 95
    int scores2 = scores[1][1]; // 96

객체를 참조하는 배열

	public static void main(String[] args) {

		String[] strArry = new String[3];
		strArry[0] = "Java";
		strArry[1] = "Java";
		strArry[2] = new String("Java");
		
		System.out.println(strArry[0] == strArry[1]); // true
		System.out.println(strArry[0] == strArry[2]); // false
		System.out.println(strArry[0].equals(strArry[2])); // true
	}

배열 복사

  • for문을 사용하거나 System.arraycopy()메서드를 사용
	System.arraycopy(원본배열, 인덱스, 대상배열, 인덱스, 복사할 개수);
    
    // forans 사용 
    int[] oldIntArray = {1, 2, 3};
    int[] newIntArray = new int[5];

	for(int i = 0; i < oldIntArray.length; i++) {
		newIntArray[i] = oldIntArray[i];
    }

	for(int i = 0; i < newIntArray.length; i++) {
    	System.out.print(newIntArray[i] + ", ");
    }
    
    // System.arraycopy()메서드를 사용 
    String[] oldStrArray = {"java", "array", "copy"};
    String[] newStrArray = new String[5];

	System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);

	for(int i = 0; i < newStrArray.length; i++) {
    	System.out.print(newStrArray[i] + ",");
    } 

향상된 for문

  • 배열의 항목 개수만큼 반복하고, 자동적으로 for문을 빠져나간다.
	for(타입 변수 : 배열) {
    	실행문;
    }
    
    int[] scores = {95, 71, 84, 93, 87};
		
		int sum = 0;
		for (int score : scores) { // 향상된 for문 사용
			sum += score;
		}

05-2 열거 타입

  • 열거 타입 : 한정된 값인 열거 상수중에서 하나의 상수를 저장하는 타입

열거 타입 선언

  • 열거 타입의 이름을 정하고 해당 이름으로 소스파일(.java)을 생성
    => 열거 타입 이름은 첫글자는 대문자, 나머지는 소문자로 구성 / 여러 단어로 구성된 이름이라면 각 단어의 첫 글자는 대문자로

  • 열거 상수는 모두 대문자로 작성
    => 열거 상수가 여러 단어로 구성될 경우 단어 사이를 밑줄(_)로 연결

    // 열거 타입 선언하기 위한 키워드
	public enum 열거타입이름 {...}
    
    // 열거 타입 선언과 열거 상수 선언
    public enum Week {
	MONDAY,
	TUESDAY,
	WEDNESDAY,
	THURSDAY,
	FRIDAY,
	SATURDAY,
	SUNDAY
}

열거 타입 변수

  • 열거 타입도 하나의 타입이므로 변수를 선언하고 사용
  • 열거 타입 변수 null값 저장 가능(참조 타입이기 때문에), 열거 상수는 객체
	열거타입 변수;
    Week today;
    
    열거타입 변수 = 열거타입.열거상수;
    Week today = Week.SUNDAY;
    

0개의 댓글

관련 채용 정보