티스토리 뷰

개발자교육

24_07_31 오늘의 수업내용

regnator 2024. 7. 31. 17:14
728x90
반응형

1. 참조 타입 vs. 기본 타입

  • 기본 타입 (Primitive Type): 실제 값을 저장하는 변수로, 메모리 상에 해당 값이 직접 저장된다.
    • 예시: int a = 5; 여기서 a는 메모리 공간에 5라는 값을 직접 저장.
    • 기본 타입 종류:
      • 정수형: byte, short, int, long
      • 실수형: float, double
      • 문자형: char
      • 논리형: boolean
  • 참조 타입 (Reference Type): 객체의 메모리 주소(참조)를 저장하는 변수로, 실제 데이터는 힙 메모리에 저장되고, 변수는 그 데이터의 주소를 가리킨다.
    • 예시: String s = "Hello"; 여기서 s는 "Hello" 문자열의 메모리 주소를 저장한다.
    • 참조 타입 종류:
      • 배열: int[], String[]
      • 클래스: String, Scanner
      • 인터페이스: List, Map
      • 열거 타입: enum Day { MONDAY, TUESDAY }

2. 배열 (Array)

  • 배열 선언과 초기화:
int[] numbers = new int[5]; // 길이가 5인 정수형 배열 선언
numbers[0] = 10; // 첫 번째 요소에 값 할당
 
  • 2차원 배열 예시:
String[][] arr = {
    {"1번째 배열의 1번째 데이터", "1번째 배열의 2번째 데이터", "1번째 배열의 3번째 데이터"},
    {"2번째 배열의 1번째 데이터", "2번째 배열의 2번째 데이터", "2번째 배열의 3번째 데이터"}
};

System.out.println(arr[0][0]); // 1번째 배열의 1번째 데이터 출력

 

  • 배열 예시:
public static void referenceSample2() {
		String[][] arr = new String[2][3];
		arr[0][0] = "1번째 배열의 1번째 데이터";
		arr[0][1] = "1번째 배열의 2번째 데이터";
		arr[0][2] = "1번째 배열의 3번째 데이터";

		arr[1][0] = "2번째 배열의 1번째 데이터";
		arr[1][1] = "2번째 배열의 2번째 데이터";
		arr[1][2] = "2번째 배열의 3번째 데이터";

		System.out.println(arr[0][0]);
		System.out.println(arr[0][1]);
		System.out.println(arr[0][2]);
		System.out.println(arr[1][0]);
		System.out.println(arr[1][1]);
		System.out.println(arr[1][2]);

		// 이렇게 길이를 정하지 않고 설정할수 있지만 길이를 설정하고 설정하지 않는것은 권장하지 않는다
		// 이렇게 무한정으로 늘어나는 코드를 설정하면 좋지 않다
		String[][] arr2 = { 
				{ "1번째 배열의 1번째 데이터", "1번째 배열의 2번째 데이터", "1번째 배열의 3번째 데이터" },
				{ "2번째 배열의 1번째 데이터", "2번째 배열의 2번째 데이터", "2번째 배열의 3번째 데이터" }
		};
		System.out.println(arr2[0][0]);
		System.out.println(arr2[0][1]);
		System.out.println(arr2[0][2]);
		System.out.println(arr2[1][0]);
		System.out.println(arr2[1][1]);
		System.out.println(arr2[1][2]);

	}

3. null과 NullPointerException

  • null: 참조 타입 변수에 아무런 객체도 연결되어 있지 않음을 의미한다. 만약 null을 참조하려고 하면 NullPointerException이 발생할 수 있다.

4. 예외 처리 (Exception Handling)

  • 예외 (Exception): 프로그램 실행 중 발생하는 오류로, 처리하지 않으면 프로그램이 비정상 종료.
  • int[] intArray = null; intArray[0] = 1; 코드를 실행하면, intArray가 null이므로 NullPointerException이 발생한다.

5. 얕은 복사와 깊은 복사

  • 얕은 복사 (Shallow Copy):
    • 설명: 원본 배열과 복사된 배열이 같은 메모리 주소를 공유한다. 따라서, 복사된 배열에서 데이터를 수정하면 원본 배열도 영향을 받는다.

예시:

int[] original = {1, 2, 3};
int[] shallowCopy = original; // 얕은 복사
shallowCopy[0] = 10;
System.out.println(original[0]); // 10 출력, 원본 배열도 변경됨
 
 
 
  • 깊은 복사 (Deep Copy):
    • 설명: 원본 배열의 각 요소를 새로운 메모리 공간에 복사하여, 복사된 배열과 원본 배열이 독립적인 메모리 공간을 가진다. 따라서, 복사된 배열에서 데이터를 수정해도 원본 배열은 영향을 받지 않는다.

예시:

int[] original = {1, 2, 3};
int[] shallowCopy = original; // 얕은 복사
shallowCopy[0] = 10;
System.out.println(original[0]); // 10 출력, 원본 배열도 변경됨

6. 메모리 사용 영역

  • 스택 영역 (Stack): 메서드 호출 시 지역 변수와 매개변수가 저장되는 공간. 메서드 실행이 끝나면 자동으로 사라진다.
  • 힙 영역 (Heap): 객체와 배열이 저장되는 공간. 참조 타입 변수가 이 영역에 있는 객체를 가리킨다. 가비지 컬렉션(Garbage Collection)을 통해 더 이상 사용되지 않는 객체가 자동으로 제거.
  • 메서드 영역 (Method Area): 클래스의 코드, 메서드, 정적 변수 등이 저장되는 영역.

7. 열거타입(enum)

  • 개념: 자바에서 제한된 상수들의 집합을 정의하는 데이터 타입. 주로 특정 값들로 제한된 데이터를 표현할 때 사용.
  • 열거 타입 주 사용방법
    1. 상수 집합 정의: 열거 타입을 통해 한정된 값의 집합을 정의.
    2. Switch 문에서 사용: 열거 타입은 switch 문에서 조건문으로 자주 사용.
    3. 메서드와 필드 추가: 열거 타입에 메서드와 필드를 추가하여 더 복잡한 동작을 정의할 수 있다.

 

  • 사용 예시

1. 간단한 열거 타입 예시

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public class EnumExample {
    public static void main(String[] args) {
        Day today = Day.MONDAY;

        switch (today) {
            case MONDAY:
                System.out.println("오늘은 월요일입니다.");
                break;
            case TUESDAY:
                System.out.println("오늘은 화요일입니다.");
                break;
            // 다른 요일에 대한 케이스 추가 가능
            default:
                System.out.println("오늘은 주말입니다.");
                break;
        }
    }
}

 

2. 메서드와 필드를 가진 열거 타입

enum Season {
    SPRING("봄", "따뜻하다"), 
    SUMMER("여름", "덥다"), 
    FALL("가을", "시원하다"), 
    WINTER("겨울", "춥다");

    private final String koreanName;
    private final String description;

    Season(String koreanName, String description) {
        this.koreanName = koreanName;
        this.description = description;
    }

    public String getKoreanName() {
        return koreanName;
    }

    public String getDescription() {
        return description;
    }
}

public class EnumExample2 {
    public static void main(String[] args) {
        for (Season season : Season.values()) {
            System.out.println(season.getKoreanName() + "은 " + season.getDescription());
        }
    }
}

 

열거 타입 사용 시 장점

  1. 타입 안정성: 열거 타입을 사용하면 허용된 상수 값들만 사용할 수 있어, 실수를 줄일 수 있다. 예를 들어, 요일을 표현할 때 문자열로 "MONDAY"를 사용한다면 오타로 인해 오류가 발생할 수 있지만, 열거 타입을 사용하면 이러한 오류를 방지할 수 있다.
  2. 가독성 향상: 열거 타입을 사용하면 코드의 의미를 명확하게 표현할 수 있다. 예를 들어, Day.MONDAY와 같이 열거형 상수를 사용하면 코드가 더 직관적으로 이해된다.
  3. 상수 그룹화: 관련된 상수들을 하나의 열거 타입으로 그룹화함으로써 코드의 구조를 더 명확하게 만들 수 있다.
  4. 추가 기능: 열거 타입은 클래스처럼 메서드와 필드를 가질 수 있어, 복잡한 동작을 정의하거나 관련 데이터를 함께 저장할 수 있다.

열거 타입 사용 시 단점

  1. 유연성 부족: 열거 타입은 컴파일 시점에 값이 결정되기 때문에, 런타임에 동적으로 값의 집합을 변경하거나 추가하는 것이 불가능. 따라서 고정된 값의 집합이 아닌 경우에는 사용하기 어렵다.
  2. 오버헤드: 열거 타입은 클래스와 유사하게 동작하므로, 메모리와 성능 면에서 약간의 오버헤드가 발생할 수 있다. 그러나 이 단점은 일반적인 사용에서는 크게 문제가 되지 않으며, 성능이 극히 중요한 상황에서만 고려될 필요가 있다.
  3. 버전 관리 어려움: 열거 타입에 정의된 상수 값이 변경되면, 이를 사용하는 모든 코드가 영향을 받습니다. 따라서 열거 타입을 자주 변경해야 하는 경우에는 코드 유지보수에 어려움이 있을 수 있다.

8. 문자열 비교와 관련 메서드

  • 문자열 비교: 문자열을 비교할 때 == 연산자가 아닌 equals() 메서드를 사용해야 정확한 비교가 가능.

예시:

String str1 = "Hello";
String str2 = new String("Hello");

System.out.println(str1 == str2); // false 출력 (주소 비교)
System.out.println(str1.equals(str2)); // true 출력 (값 비교)

 

 

문자열 관련 메서드:

 

1.특정 위치 문자 추출 (charAt()):

  • 설명: 문자열에서 특정 위치의 문자를 추출.

예시:

String str = "Hello";
char ch = str.charAt(1); // 'e' 추출

 

 

2. 문자열 길이 (length()):

  • 설명: 문자열의 길이를 반환.

예시:

String str = "Hello";
int len = str.length(); // 5 반환

 

 

3. 문자열 대체 (replace()):

  • 설명: 문자열 내 특정 문자열을 다른 문자열로 대체.

예시:

String str = "Hello World";
String newStr = str.replace("World", "Java"); // "Hello Java" 반환

 

 

4. 문자열 잘라내기 (substring()):

  • 설명: 문자열의 특정 부분을 잘라서 반환.

예시:

 
String str = "Hello World";
String subStr = str.substring(0, 5); // "Hello" 반환

 

 

참조타입.pptx
19.01MB

728x90
반응형

'개발자교육' 카테고리의 다른 글

24_07_26 오늘의 수업내용  (0) 2024.08.04
24_08_01 오늘의 수업내용  (0) 2024.08.01
24_07_25 오늘의 수업내용  (0) 2024.07.25
24_07_19 오늘의 수업내용  (0) 2024.07.23
24_07_17 오늘의 수업내용  (0) 2024.07.22