JAVA 웹 개발 패키지 - 패스트캠퍼스/Chapter4

String 클래스, Class 클래스

giggs 2022. 1. 10. 11:56

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 :)