GSJun

6/9 수업 정리 본문

코리아아카데미학원(웹 개발)

6/9 수업 정리

GSJun 2023. 6. 23. 22:13

1. Wrapper 클래스

프로그램에 따라 기본 타입의 데이터를 객체형으로 표현해야 하는 경우가 있음

 

이를 위해 기본 자료형을 객체로 다루기 위한 클래스를 제공하는데, 이러한 클래스를 Wrapper 클래스라고 한다

 

String은 이미 객체형이므로 String은 그대로 씀

 

오토박싱(AutoBoxing)과 오토언박싱(AutoUnBoxing)

Wrapper 클래스도 데이터 타입이나 기본적으로 클래스이기 때문에 객체를 선언해 사용해야 한다

ex)

Integer num01 = new Integer(1); //JDK 1.9부터 사용하지 않도록 권장함

Integer num02 = Integer.valueOf(10);

기본 타입의 데이터를 Wrapper 클래스의 인스턴스로 변환하는 과정을 박싱(Boxing)이라고 하고,

반대로 Wrapper 클래스의 인스턴스에 저장된 값을 기본 타입의 데이터로 꺼내는 과정을 언박싱(UnBoxing)이라고 한다

JDK 1.5부터는 박싱과 언박싱이 필요한 상황에 자바 컴파일러가 자동으로 처리해 주는데, 이를 오토박싱과 오토언박싱이라고 부른다.

 

오토박싱 ex)

Integer num01 = 10;

 

문자 타입의 데이터를 숫자 타입의 데이터로 변환

프로그램을 개발하다 보면 외부로부터 데이터를 받는 경우가 종종 있다

이러한 데이터 중 숫자로 표기되어 있지만 전송의 편의상 모든 데이터를 문자 or 문자열 타입으로 전송하는 경우들이 있다

이런 경우, 받는 쪽에서는 데이터 타입을 변경해 사용해야 한다

Wrapper 클래스에는 문자 타입의 데이터를 숫자(정수 또는 실수) 타입의 데이터로 변경할 수 있는 기능이 있다

정수는 소수점을 모르기 때문에

예로 byte, short, int, long형에 "100.1"을 넣으면 에러가 난다

 

컬렉션, 형변환을 할 때 주로 Wrapper 클래스로 한다

 

예제

package day18;

 

public class WrapperTest {

public static void main(String[] args) {

//일반변수의 객체형 선언 auto boxing 기능

Integer num01 = 10;

//더이상 사용하지는 않는 방법

Integer num02 = new Integer(10); //줄이 처저 있는 이유 -> 저 기능이 필요하진 않으나 호환성 상에만 있는 것

 

//메서드를 이용한 방법

Integer num03 = Integer.valueOf(10);

 

//숫자형태의 문자를 형변환 가능1

Integer num04 = Integer.valueOf("10"); //Integer 타입

 

//숫자형태의 문자를 형변환 가능2

Integer num05 = Integer.parseInt("10");//int 타입

 

//함수나 메소드를 이용해 값을 비교해야 함

System.out.println(num01 == num02);

System.out.println(num01.equals(num02));

System.out.println(num01.intValue() == num02.intValue());

System.out.println(num01 == num03);

 

 

}

}

 

2. 컬렉션 프레임워크(Collection Framework)

자료 구조는 프로그램 실행 시 메모리에 자료를 유지하고 관리하기 위해 사용한다

배열은 정한 크기를 변경하거나 삭제할 수 없고, 별도의 기능이 없기 때문에 직접 index를 이용해 데이터를 저장해야 했다

java는 이런 불편함을 해결하기 위해 필요한 자료구조를 미리 구현해 java.util 패키지에서 제공하고 있다

이를 컬렉션 프레임위크라 한다

 

컬렉션 기존에 있던 List, Queue, Tree 등의 자료 구조를 뜻하고 프레임워크는 클래스와 인터페이스를 묶어놓은 개념이다

즉, 컬렉션 프레임워크란 기존에 존재했던 자료구조에 인터페이스로 설계된 기능을 클래스를 통해 제공해 데이터 관리에 용이한 자료 구조 객체를 구조화 한 것을 말한다

 

컬렉션 프레임워크에서는 데이터를 저장하는 자료구조에 따라 다음과 같이 주요 인터페이스를 정의하고 있다

 

 

List, Set, Map은 인터페이스이고 각각의 구현체들이 구현되어 있는 구조이다

(우리가 사용하는 것은 구현체임)

 

각각의 특징

 

제네릭(Generic)

클래스나 메서드 정의 시 일반화하여 사용할 데이터 타입을 컴파일할 때 미리 지정하는 방법

JDK 1.5 이전에는 여러 타입을 사용하는 대부분의 클래스나 메서드에서 반환값으로 Object 타입을 사용했다

이러한 경우 잘못된 캐스팅으로 인해 런타임 오류가 발생할 가능성이 있었다

 

하지만 JDK 1.5부터 도입된 제네릭을 사용하면 컴파일할 때 타입이 미리 정해지므로 타입 검사나 반환과 같은

번거로운 작업을 생략할 수 있고, 클래스나 메서드 내부에 사용될 데이터 타입의 안정성을 높일 수 있다

package day18;

 

public class DataList {

private Object[] data; //Object 타입의 객체 선언

private int size; //배열 크기 변수 선언

private final int DEFAULT_SIZE = 10; // 기본 배열 사이즈 변수 선언 및 초기화

 

public DataList() {

data = new Object[DEFAULT_SIZE]; //기본 생성자를 통해 기본 사이즈로 생성

}

 

public DataList(int size) { //크기가 있을 땐 매개변수 생성자를 통해 생성

data = new Object[size];

}

 

public void add(Object value) { //데이터 넣음

data[size++] = value;

}

public Object get(int index) { //데이터 추출

return data[index];

}

 

public int size() { //크기 반환 함수

return size;

}

}

 

package day18;

 

public class DataListEx {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

DataList list = new DataList();

 

list.add(10); //Object 임으로 오토 박싱으로 인해 Integer로 들어감

 

list.add("문자"); //String은 그냥 String으로 들어감

 

list.add(10.33); //Object 임으로 오토 박싱으로 인해 Double로 들어감

 

double sum = 1.1;

for(int i=0;i<list.size();i++) { //데이터 출력

Object data = list.get(i); //Object

 

// sum += (double)list.get(i); 에러남 각각의 데이터 타입을 하나하나 확인해서 형변환을 시켜줘야 한다... 귀찮음

if(data instanceof Integer) {

System.out.println("정수 : "+(int)data);

}

else if(data instanceof Double) {

System.out.println("실수 : "+(double)data);

sum += (double)list.get(i);

System.out.println(sum);

}

else if(data instanceof String) {

System.out.println("문자열 "+(String)data);

}

}

}

 

}

 

 

Object 최상의 클래스 임으로 어떠한 데이터 형태라도 저장이 가능하다.

하지만 데이터를 저장한 후 실제 꺼내어 사용하려면 어떤 데이터 타입을 지녔는지 일일이 확인해야 하고,

약속한 데이터가 입력되지 않아 에러가 발생할 수 있다

 

Generic 선언 및 생성

제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말하며, 다음과 같이 선언한다.

클래스 또는 인터페이스 이름 뒤에 <>기호를 추가하고 안에 타입 파라미터를 입력한

위에서 사용된 'T'를 타입 변수(type variable)라고 하며. 이를 이용해 타입을 제한한다.

여러 개의 타입 변수는 쉼표(,)로 구분하여 명시할 수 있다.

타입 파라미터는 정해진 규칙은 없지만 일반적으로 알팝벳 대문자 한 글자로 표현한다.

 

다음은 제네릭에서 자주 사용되는 타입의 인자와 의미이다.

package day18;

 

public class GenericDataList<T> { //

private Object[] data;

private int size; //배열 크기 변수 선언

private final int DEFAULT_SIZE = 10; // 기본 배열 사이즈 변수 선언 및 초기화

 

public GenericDataList() {

this.data = new Object[DEFAULT_SIZE]; //기본 생성자를 통해 기본 사이즈로 생성

}

 

public GenericDataList(int size) { //크기가 있을 땐 매개변수 생성자를 통해 생성

this.data = new Object[size];

}

 

public void add(T value) { //데이터 넣음

this.data[size++] = value;

}

public T get(int index) { //데이터 추출

return (T)this.data[index];

}

 

public int size() { //크기 반환 함수

return this.size;

}

}

 

package day18;

 

public class GenericDataMain {

 

public static void main(String[] args) {

 

//제네릭 타입 기본 선언

GenericDataList<String> strList = new GenericDataList<String>();

// jdk 1.7 이후부터는 오른쪽 제네릭 타입 생략 가능

GenericDataList<Integer> intList = new GenericDataList<>();

//하나의 클래스를 만들어 여러 타입을 넣어 사용할 수 있는 것이 제네릭이다

 

//이젠 제네릭이 매우 중요해져서 사용하는 방법을 아는 것이 중요하다

//자바 책은 무조건 최신 책으로 사야 좋다

 

}

 

}

 

 

반복자 Iterator

Iterator<E>는 List 컬렉션에서 제공하는 인터페이스로

LIst 컬렉션의 요소를 순회하여 하나씩 추출하는 데 사용한다

E에는 순회할 데이터의 타입을 지정하는데 보통 순회할 컬렉션이 포함하는 데이터 타입과 동일하게 지정한다

 

반복자라 불리는 Iterator 객체는 컬렉션 객체에서 가져와 사용한다

'코리아아카데미학원(웹 개발)' 카테고리의 다른 글

6/12 수업 정리  (0) 2023.06.28
06-21 수업 정리  (0) 2023.06.21
2차시 수업 정리  (0) 2023.05.16