String, StringBuilder, StringBuffer 클래스, text block
String 클래스
- String 선언하기
String str1 = new String("abc");
String str2 = "abc";
- 힙 메모리에 인스턴스로 생성되는 경우와 상수 풀(constant pool)에 있는 주소를 참조하는 두 가지 방법
- ① new String으로 생성하면 -> 힙 메모리에 생성
- ② "abc"로 생성하면 상수 풀에 있는 "abc" 사용하는 개념
- 힙 메모리는 생성될때마다 다른 주소 값을 가지지만, 상수 풀의 문자열은 모두 같은 주소 값을 가짐
public class StringTest {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2); -> false 나옴
String str3 = "abc";
String str4 = "abc";
System.out.println(str3 == str4); -> true 나옴
}
}
- 한번 생성된 String은 불변(immutable)
- String을 연결하면 기존의 String에 연결되는 것이 아닌 새로운 문자열이 생성됨 ( 메모리 낭비가 발생할 수도 )
java 따로 / android 따로 / javaandroid 따로 메모리 잡혀있는 것이다.
메모리 문제 해결하기 위해 - StringBuilder, StringBuffer활용
StringBuilder, StringBuffer 활용하기
- 내부적으로 가변적인 char[ ]를 멤버 변수로 가짐 -> final 아님
- 문자열을 여러번 연결하거나 변경할 때 사용하면 유용함
- 새로운 인스턴스를 생성하지 않고 char [ ]를 변경함
- StringBuffer는 멀티 쓰레드 프로그래밍에서 동기화(synchronization)를 보장
- 단일 쓰레드 프로그램에서는 StringBuilder 사용을 권장 ( 멀티쓰레드 - StringBuffer / 단일 - StringBuilder )
- toString() 메서드로 String반환
연결 전과 후 해쉬 코드로 주소 값 출력 확인 ---
text block 사용하기 (java 13)
- 문자열을 """ """ 사이에 이어서 만들 수 있음
- html, json 문자열을 만드는데 유용하게 사용할 수 있음
String 편하게 쓸 수 있지만 up버전 쓰는 경우 많지 않으므로 String 버퍼나 빌드로 사용한다.
Class 클래스 사용하기
Class 클래스
- 자바의 모든 클래스와 인터페이스는 컴파일 후 class 파일이 생성됨
- Class 클래스는 컴파일된 class 파일을 로드하여 객체를 동적 로드하고, 정보를 가져오는 메서드가 제공됨
- Class.forName("클래스 이름") 메서드로 클래스를 동적으로 로드함
- runtime 시에 필요한 클래스 로딩하여 사용하는 동적 로딩
Class c = Class.forName("java.lang.String");
클래스 이름으로 직접 Class 클래스 가져오기
Class c = String.class;
생성된 인스턴스에서 Class 클래스 가져오기
String s = new String();
Class c = s.getClass(); //Object 메서드
동적 로딩
- 컴파일 시에 데이터 타입이 binding 되는 것이 아닌, 실행(runtime) 중에 데이터 타입을 binding 하는 방법
- 프로그래밍 시에는 문자열 변수로 처리했다가 런타임 시에 원하는 클래스를 로딩하여 binding 할 수 있다는 장점
- 컴파일 시에 타입이 정해지지 않으므로 동적 로딩 시 오류가 발생하면 프로그램의 심각한 장애가 발생 가능
- 런타임 시 로딩으로 속도 느려질 수 있음 // 동적 로딩 시 라이브러리나 클래스가 없거나 스펠링 틀릴 경우-오류
Class의 newInstance() 메서드로 인스턴스 생성
- new 키워드를 사용하지 않고 클래스 정보를 활용하여 인스턴스를 생성할 수 있음
Class.for name() 메서드로 클래스 가져와서 newInstance()
ex) Class c = Class.forName("java.lang.String");
생성된 인스턴스에서 Class 클래스 가져와서 newInstance()
Lee라는 인스턴스 생성된 상태에서 getClass() - 오브젝트 메서드로 - 인스턴스 하는 법
내 로컬에 Person 타입의 class가 없을 때
Person Class를 불러오고 constructor 정보를 가져와서
Person을 추가하거나 사용할 때
Class.for name()이나 getClass() 방법으로 사용
클래스 정보 알아보기
- reflection 프로그래밍 : Class 클래스를 사용하여 클래스의 정보(생성자, 변수, 메서드)등을 알 수 있고 인스턴스를 생성하고, 메서드를 호출하는 방식의 프로그래밍
- 로컬 메모리에 객체 없는 경우, 원격 프로그래밍, 객체의 타입을 알 수 없는 경우에 사용
- java.lang.reflect 패키지에 있는 클래스를 활용하여 프로그래밍
- 일반적으로 자료형을 알고 있는 경우엔 사용하지 않음
String 클래스에 저렇게 많은 생성자와 메서드들이 존재하는 것을 확인
하지만 저렇게 프로그램하는 일은 많지 않다. String 클래스 사용 시
String 클래스 사용 시 - 위의 방법으로 어떤 메서드와 생성자 사용 가능한지 다 볼 수 있음!
그렇다면 클래스 정보를 불러와서 사용하는 경우는?
내 로컬에 이 오브젝트가 없을 때 - 리모트에 있는 오브젝트나 클래스를 임복케이션시킬때 - reflect 애들 사용
로컬 메모리에 객체 없는 경우, 원격 프로그래밍, 객체의 타입을 알 수 없는 경우에 reflection 프로그래밍 사용
review
String class와 Class class에 대해 배웠다.
String 클래스에서 문자열 연결과 메모리의 관계
Class 클래스에서 사용할 때 필요한 클래스 불러서 사용하는 동적 로딩과
내 로컬에 필요한 타입의 클래스 없을 때 그 클래스의 정보를 불러와서
new키워드가 아닌 newInstance()로 생성해주는 법
String을 연결할 때 그냥 연결하면 새로운 주소 값으로 메모리가 잡혀서 생기고
기존에 가리키던 주소 값에 있던 메모리는 없어지지 않는 부분이 신기하였다.
1+1=3 이 되는 부분? ㅎㅎ StringBuffer와 StringBuilder(단일 추천) 잘 사용해보자!
클래스 클래스. 변수를 불러와서 사용하는 수준에서
이제 클래스를 불러와서 사용한다! ㅎㅎ
필요한 클래스를 다 로딩해놓는 것이 아니라 사용할 때 필요한 클래스를 불러서 로딩해서 사용!
그 클래스가 내 로컬에 없을 때는 사용하는 것이 좀 복잡해졌지만.
변수 불러서 사용하는 것처럼 클래스 불러서 사용하는 것으로 이해했다.
GOOD :)
'JAVA 웹 개발 패키지 - 패스트캠퍼스 > Chapter4' 카테고리의 다른 글
Object 클래스 - toString(), equals(), hashCode(), clone() (0) | 2022.01.10 |
---|