복습

자바 12일차 - String, StringBuffer, StringBuilder, Wrapper클래스 제네릭 클래스, 제네릭 메서드 본문

자바

자바 12일차 - String, StringBuffer, StringBuilder, Wrapper클래스 제네릭 클래스, 제네릭 메서드

ykm1256 2020. 4. 2. 23:51

String클래스

String str1 = neww String("abc");   //생성자의 매개변수로 문자열 생성
String str2 = "test";                          // 문자열 상수를 가리키는 방식
와 같이 두가지 방식이 있다. str1은 힙메모리에 생성된 객체를 가리키고, str2는 상수풀에잇는 문자열 상수를 가리킴

 

String 클래스의 final char[] 변수

자바는 char[]배열을 직접 구현하지 않고도 편리하게 문자열을 사용할 수 있다.
String클래스에 private final char value[] 라고 선언되어 있다. 따라서 String s = new String("abc")라고 쓰면 value변수에 저장되는데 이는 final로 선언되어 있다. 따라서 한 번 생성된 문자열은 변경되지 않는다.

concat을 이용하여 두 개의 문자열을 연결할 수 있는데
 javaStr = javaStr.concat(androidStr); 에서 concat은 객체를 새로 생성하여 javaStr문자열과 androidStr문자열을 연결하고 javaStr에 대입한다. 위에서 value 변수가 final로 선언되있다고 하였다. 따라서 기존의 javaStr이 가리키던 객체는 사라지고 새로운 객체를 가리켜 주소 값이 달라진다.

 

StringBuffer와 StringBuilder
String 클래스를 사용하여 문자열을 연결하거나 변경하면 메모리가 많이 낭비된다. 이를 해결하기 위해 StringBuffer와 StringBuilder 클래스를 사용한다.
이 두 클래스는 내부에 변경 가능한 char[]를 변수로 가지고 있기 때문에 문자열을 연결하거나 변경할 때 기존에 사용하던 배열이 확장되므로 추가 메모리를 사용하지 않는다. 차이점은 멀티 스레드 프로그램에서 StringBuffer클래스는 문자열이 안전하게 변경되도록 보장하고, StringBuilder 클래스는 안전하지 않지만 실행속도가 빠르다.

javaStr 변수를 만들어 String객체를 생성하고 문자열 Java를 대입했다. 그리고 StringBuilder 객체를 만들어 javaStr 값을 대입하고 주소를 출력한다. 그 다음 StringBuilder 객체에 다른 append를 이용해 문자열을 추가로 여러번 대입한 후 주소를 출력한다. 결과를 보면 문자열을 추가로 대입하기 전과 후의 주소값은 같다. 이유는 StringBuilder 클래스는 final이 아닌 char[]변수를 가지고 있기 때문에 추가 메모리를 사용하지 않기 때문이다. 마지막에 javaStr에 buffer 값을 대입한 후 주소값을 출력하면 이전의 값과 다르다. 이는 String 클래스는 final 형으로 선언되어 있기 때문이다.

 

Wrapper 클래스
: 정수를 사용할 때 기본형인 int를 사용하는데 이를 객체형으로 사용해야할 경우가 있다. 이때 기본 자료형처럼 사용할 수 있는 클래스가 있다. 기본자료형을 감쌌다는 의미로 Wrapper 클래스라고 한다.

 

Integer 클래스
: Wrapper 클래스중에 가장 대표적인 클래스로 int 자료형을 감싼 클래스이다.
Integer iValue = new Integer(100);
int myValue = uValue.intValue(); 
-> intValue()메서드를 사용하여 Integer클래스 내부의 int 자료형 값 가져오기

Integer number1 = Integer.valueOf("100");
Integer number2 = Integer.valueOf(100);
-> valueOf() 정적 메서드를 사용하여 생성자를 사용하지않고 정수나 문자열을 바로 Integer 클래스로 반환

int num = Integer.parseInt("100");
->parseInt() 메서드로 문자열이 숫자일 때 문자열의 int 값을 바로 가져오기

 

오토박싱과 언박싱
: 기본형을 객체형으로 바꾸는것을 오토박싱, 객체형을 기본형으로 꺼내는 것을 언박싱 이라고 한다.

 

Class 클래스
: 모르는 클래스의 정보를 사용할 때 클래스 정보를 직접찾기 위해 활용하는 클래스

클래스 정보 찾는 방법 3가지 - getClass() 메서드 사용, 클래스 파일 이름 Class 변수에대입 , Class.forName()메서드 사용

*forName()메서드 사용시 존재하는 클래스를 문자열로 대입해야함.


Class 클래스를 활용해 클래스의 정보를 가져오고, 이를 활용해 인스턴스를 생성하거나 메서드를 호출하는 방식을 리플렉션이라고 한다.

 

Constructor, Method, Field 메서드를 이용하여 클래스 정보 찾기

Class 클래스 객체를 Constructor, Method, Field 메서드를 이용하여 각각 생성자, 메서드, 필드 정보를 출력하였다.

 

제네릭
: 어떤 값이 하나의 참조 자료형이 아닌 여러 참조 자료형을 사용할 수 있도록 프로그래밍 하는 것을 제네릭 프로그래밍이라고 한다. 프로그램이 더욱 유연해진다.

 

제네릭 클래스

제네릭 클래스 GenericPrinter 클래스를 만들고 set, get 메서드를 자료변수 T를 인자로 사용하여 구현했다. 그리고 메인함수에서 GenericPrinter 변수를 만드는데 자료 변수를 앞에서 선언한 Powder와 Plastic 클래스형으로 만들었다. 그리고  생성자로 객체를 생성하여 set함수로 변수에 대입한 후 변수 값을 출력했다. 결과는 각각의 클래스에 toString()메서드를 재정의 했으므로 각각 재정의한 메서드가 호출된다.

 

자료변수를 extends를 사용하여 상속받기

위의 코드에서 Material이라는 추상클래스를 추가하여 Powder, plastic 클래스가 상속받는다. 그리고 제네릭 클래스의 자료변수 T은 Material로 자료형을 제한한다. 그 다음 T 타입의 변수를 선언하고 Material클래스의 메서드를 호출하는 printing()메서드를 구현했다. 그리고 메인함수에서 printing()메서드를 추가로 사용하여 각 클래스에 있는 doprinting()메서드를 호출하여 결과를 출력한다.

 

제네릭 메서드
: public <자료형 매개변수> 반환형 메서드이름(자료형 매개변수){}

제네릭 메서드 equal()을 구현하여 정수값, 실수값, 문자열 상관없이 매개변수로 받아서 결과를 출력하였다.