Programming/Java

[ JAVA 수업 DAY 06 ] 문자열

빠모스 2020. 5. 5. 01:19
반응형

문자열 정의

자바에서는 문자열을 모두 객체로 취급한다. 즉, 클래스로 구성되있다.

실제 문자열을 제공하는 클래스는 String, StringBuffer, StringBuilder이 있는데 셋 다 java.lang 패키지에 있다.

근데 java.lang 내의 클래스는 굳이 import하지 않아도 다 자동 임포트가 되어있다. 

문자열은 length() 메소드를 쓰고, 배열은 length 변수를 쓴다. 배열은 클래스가 아니라서 메소드를 못쓴다. 컴퓨터가 내부적으로 length를 활용해 알아서 해석한다. 

 

 

  • String 클래스 : 한번 생성된다음 변하지 않는 문자열에 사용

일종의 상수문자열. 한번 문자열을 만들면 절대 변경할 수 없다.

ex) 

String str = “Hello world”;
str = “abc”;

=> 이 경우 str 변수 자체값이 바뀌는게 아니라 “Hello world”가 입력된 공간의 주소값을 받다가 “abc”라고 저장된 공간의 주소값을 받게됨. 

 

 

  • StringBuffer 클래스 : 계속하여 변할 수 있는 문자열에 사용, 동기화 적용
  • StringBuilder 클래스 : 계속하여 변할 수 있는 문자열에 사용, 비동기화

요즘은 StringBuilder를 많이 쓴다.

 

ex) 

String str01 = new String(“Hello”);
String str02 = “Hello”;
String str03 = new String(“Hello”);
String str04 = “Hello”;

=> string 클래스는 new를 쓰지 않아도 된다. 하지만 사실 new를 쓸 때와 안쓸때 사이에는 애매한 차이가 존재한다. 위 코드대로라면 아래와 같은 그림이 가능하다.

 

02와 04는 변수명은 다르지만 같은 값을 가지기때문에 같은 값의 주소를 참조한다. new를 통해 생성한 01과 03은 값은 같지만 서로 다른 주소값을 갖는다. 그래서 02가 수정되면 04도 수정되지만, 01과 03은 서로 영향을 미치지 않는다. 

 

 

=> new로 할당된 String은 heap에 새로운 공간이 생기지만, new 없이 생긴애들은 해당 문자열이 저장된 주소값만 참조하게 된다. 

new를 안한 상수문자열은 내용이 변경되서 다른 문자열의 주소를 참조하더라도, 전에 참조하던 문자열은 특이하게 가비지컬렉터가 지우지 못한다. 그래서 다시 되돌아갈때도 new로 새로 생성하지 않아도 사라지지 않고 그자리에 있으니 String 02 = “Hello”; 다시 할당해주면 된다. 

String은 자바를 제외한 다른 언어들은 new를 써서 선언해주는게 당연시되지만, 자바에선 new를 쓰나 안쓰나 똑같은 주소값을 참조하니까 그냥 상수문자열을 많이 쓴다. 

 

 

문자열 비교 메소드

 

  • boolean equals(Object str) : int형처럼 a == b를 못하는 이유는 str01과 str02가 서로 참조하고있는 문자열을 비교해야 하기 때문에. 대소문자를 구분한다.
  • boolean equalsIgnoreCase(String str) : 문자열 비교시 대소문자 무시
  • boolean startsWith(String str) : 문자열이 str로 시작하면 true, 아니면 false
  • boolean endsWith(String str) : 문자열이 str로 끝나면 true, 아니면 false
  • int compareTo(String str) : 현재의 문자열과 str로 지정된 문자열을 비교하여 현재의 문자열이 str로 지정된 문자열보다 크면 양수, 같으면 0, 작으면 음수값 반환. 작다는 의미는 순서(알파벳)에 따라 앞에 온다는 의미.

 

문자열 탐색 메소드

 

  • int indexOf(String str) : str의 인덱스가 어딘지. 해당 str이 없다면 -1값 반환. 제일 처음으로 나온 문자열까지만 검색한다.
  • int indexOf(String str, int startIndex) : 문자열 탐색 시작 위치 지정 가능
  • int lastindexOf(String str) : str의 인덱스가 어딘지 뒤에서부터 검색
  • int lastindexOf(String str, int startIndex) : str의 인덱스가 어딘지 뒤에서부터 검색, 시작점 지정 가능

 

문자열 변환 메소드

- 원본 문자열은 바뀌지 않음에 유의

 

  • String substring(int startIndex, int endIndex) : 하나의 문자열에서 부분 문자열을 추출
  • String concat(String constr) : 두개의 문자열을 하나의 문자열로 합칠때
  • String replace(char original, char replacement) : 한 문자열을 다른 문자열로 치환
  • String trim() : 문자열의 시작과 끝부분에 있는 공백이 제거된 문자열을 반환
  • String toLowerCase() : 소문자로 반환
  • String toUpperCase() : 대문자로 반환
  • String [] split(String regexp)  : regexp를 기준으로 문자열을 나눈다. 

 

 

cf) 패키지와 접근제한자 : 회사에서 접근제한자를 잘 모르겠다 하면 멤버변수는 가장 보수적으로, 메소드는 가장 개방적으로 제한해놓으면 된다. 

 

static

static 특징

1. 로딩시점

- static : 클래스 로딩 시

- nonStatic : 객체 생성시

 

2. 메모리상의 차이

- static : 클래스당 하나의 메모리 공간만 할당

- nonStatic : 인스턴스 당 메모리가 별도로 할당

 

3. 문법적 특징

- static : 클래스 이름으로 접근

- nonStatic : 객체 생성 후 접근

 

4. static 영역에서는 non-static영역을 직접 접근이 불가능하지만 non-static 영역에서는 static 영역에 대한 접근이 가능.

class AAA {
	static int num = 0;
	int num2 = 0;
}

=> static 변수 num은 클래스를 해석하는 순간 메모리에 공간이 할당된다. nonStatic인 num2보다 더 빨리 메모리에 할당된다. nonStatic은 인스턴스 객체 만들때마다 메모리 공간에 할당. 

 

만약

class Dog {
	String name;
	static int price;
}

new Dog();
new Dog();

강아지 객체 두개를 만들었을 때, static은 메모리를 하나만 할당받아 객체가 여러개 생겨도 공유하는것.

name은 nonstatic이라 객체가 생길때마다 메모리가 따로따로 만들어짐. 

 

실행 시 메모리 영역

Method Area : 한 공간을 모든 사람이 같이 볼 수 있게 해주는 곳. 일종의 전역변수같은 것.

Type Information

Constant Pool

Field Information

Method Information

Class Variables

=> 클래스를 정의하는 대부분의 기본 정보들

 

Heap : Instance (객체 생성시)

 

static 변수는 클래스를 로딩하는순간만 접근가능하기때문에 객체가 생기지 않으면 메모리 할당이 이뤄지지 않는다. 그래서 static 변수는 객체.static 멤버변수 대신, 클래스.static멤버변수로 접근한다.

 

실습 코드 및 과제

https://github.com/LeenaKim/Java_Lessons/tree/master/src/kr/ac/kopo/day06

 

LeenaKim/Java_Lessons

Source codes and notes from Java Lessons / 자바 수업시간 배운 내용과 과제 코드입니다. - LeenaKim/Java_Lessons

github.com

 

반응형