참고강의: https://programmers.co.kr/learn/courses/5/lessons/138
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
ㅇ기본형 타입은 클래스가 아니다.
ㅇ앞서 배웠던 배열이나 클래스가 참조형 타입에 속한다.
참조형 변수를 하나 선언해볼까?
String str = new String("hello");
이런식으로 String이라는 클래스를 이용해서 참조형 타입 변수 str을 선언했다.
제일 앞에, 기본형 타입이 아닌 String이라는 클래스가 적혀있다.
우변에는 new다음에 생성자라는 것이 있다.
new는 클래스를 메모리에 올려주세요! 라는 뜻
이렇게 메모리에 올라간 클래스를 인스턴스라고 한다.
이 메모리에 올라간 클래스를 가르키는 변수(=참조하는, reference하는 변수)가 str이다.
변수가 인스턴스를 가지고 있는 것이 아니라.. 참조! 가르킨다! 라는 것임.
str이라는 변수에는 "메모리의 위치값"이 저장되는 것이다.
(어떤 메모리에 저장되어있는지 알 수 있는 방법은 없다. 그래서 str변수는 String 인스턴스를 참조한다라고 알면 된다.
본격적으로 참조형 변수 String클래스를 알아보자.
String 클래스 (문자열)
ㅇ문자열을 표현하는 자바에서 가장 많이 사용하는 클래스
ㅇString은 new연산자를 이용하지 않고도 인스턴스를 만들어 낼 수 있다!
ㄴ나머지 모든 클래스들은 new연산자를 이용해야지만 실제 인스턴스를 만들어낼 수 있다.
ㄴString은 기본 데이터타입 적어주는 것처럼 사용해도 기능이 된다! **특별한 클래스
ㄴ당연히 일반 클래스들처럼 new를 이용해서도 생성가능 String str = new String("hello");
String str1 = "hello"
String str2 = "hello"
String str3 = new String("hello");
String str4 = new String("hello");
<<new를 사용하지 않는 경우의 String>>
이 hello라는 문자열은 메모리 중 상수들이 저장되는 영역에 저장된다.
>>첫번째 hello와 두번째 hello가 똑같으니 두개 만들어질 필요는 없다.
>>>hello라는 인스턴스가 상수영역에 생성이 된다. 그리고 str1은 그 인스턴스를 가리키고,
>>>>str2도 hello를 가리키라고 하네? 그럼 일단 상수영역에 hello가 있는지 먼저 살펴본다. 있으면 새로 만들지 않고 hello를 가리킬 수 있다.
>>>>>즉, str1과 str2는 같은 인스턴스를 참조하고(가리키고) 있다.
ㄴ메모리를 아끼려면 new를 사용하지 않는 것이 좋다.
<<new를 사용하는 경우의 String>>
new연산자로 인스턴스를 만들면, 무조건 상수영역에 있는걸 참조하지 않는다. 인스턴스는 무조건 새롭게 만들어진다.
따라서 str3과 str4는 서로 다른 인스턴스를 참조한다. (같은 래퍼런스가 아니다!)
중요!! 비교연산 '=='
>>참조형 변수를 사용하는 상황에서, 서로 같은 것을 참조하는지 비교하는 것이 ==이다.
즉, 실제 가르키고 있는 메모리영역의 주소가 같느냐를 물어보는 거.
예)
str1 == str2 의 결과는 true이다. 같은 인스턴스를 참조하기 때문이다.
str3 == str4 의 결과는 false이다. 서로 다른 인스턴스를 참조하기 때문이다.
++String의 큰 특징 - 불변 클래스
한번 생성된 클래스는 변하지 않는다.
String이 인스턴스가 될 때 가지고 있던 값을 나중에 수정할 수 없다.
String이 가지고 있는 내부의 값이 변하지 않는다.
이게 무슨 말이냐고 하면.. 예를 하나 들 수 있다.
String이 가지고 있는 수~~~많은 메서드 중 substring을 사용하여 예시를 들어보자.
String str5 = "hello world";
String str6 = str5.substrting(3);
이때, str6은 문자열 중 3번째 인덱스부터 자른 결과를, 즉 새로운 String을 참조하게 된다.
(substring()메서드는 입력한 인덱스부터 쭉 잘라오는거다. 문자열을 자른 결과를 반환하는 메소드..)
아래 코드가 실행되어도 str5 값은 변하지 않는다.
'JAVA' 카테고리의 다른 글
[혼자 공부하는 자바] 6/28 01-1 ~ 02-2 (0) | 2020.06.28 |
---|---|
[혼자 공부하는 자바][신용권] 목차 (0) | 2020.06.28 |
[JAVA] 클래스의 구성요소 / 필드(field) (0) | 2020.04.22 |
[JAVA] 데이터 입력받기 / Scanner 메소드 / 입력 함수 (2) | 2020.04.19 |
[JAVA] 메소드 직접 만들기 / 메소드 구성 (0) | 2020.04.16 |