일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- pymongo
- POST
- java
- portfolio
- frontend
- github
- javascript
- get
- beautifulsoup
- PYTHON
- fetch
- body
- flask
- backend
- synology
- OOP
- venv
- CSS
- json
- atlas
- Project
- openapi
- Algorithm
- requests
- CRUD
- NAS
- mysql
- mongodb
- flaskframework
- Crawling
- Today
- Total
wisePocket
[JAVA] 기초문법 - char와 string의 차이? - 08 본문
문자를 변수의 타입으로 할당 하고 싶을 때 사용하는 데이터 유형이다. 앞으로 아주 많이 코드에 입력할 일이 생길 것이다.
문제는 나는 이 정도로 이해하고 있었다. "char와 string 둘다 뭐 문자 넣고 출력할때 타입에 넣고 그 변수명 쓰면 되지 않나?"
이전 국비에서 이론 개념 부분을 빠르게 지나가고 돌이켜보니, 어떤 개념적으로 차이가 있었지? 홀대하고 코드를 입력하는 것만 집중하고 넘어가서 다시 한번 공부해보니 정확한 차이점을 스스로 설명하지 못한다는 것을 깨달았다. 분명 무언가 흘려 듣긴 했다. 하지만 2개의 내용이 연결되지 않았다.
데이터 타입의 종류를 무시하고 넘어간 것이 크다.
변수라는 것 자체는 값(데이터)를 저장하는 저장공간이다. 그 창고 앞에 어떤 종류의 물건(데이터)이 몇개까지 들어갈 수 있는지 써놓은 간판이 있을 것이다. 그 간판이 타입이다. 그 물건만, 정해진 수량 이내로 들어가게 해야 한다. 공간은 한정적이기 때문이다.
문자 형 vs 문자[형,형,...]열
1. 문자 형?
- char는 *기본 타입(Primary Type)의 데이터 유형 중 하나다.
데이터의 기본 타입(Primary Type)
말 그대로 기본 타입, 해당 타입으로 변수를 선언하면, 할당 값은 그 타입을 갖는다는 것이다.
종류는 복습겸 다시 정리한다.
문자 타입 : char(2byte)
정수 타입 : byte(1), short(2), int(4), long(8)
실수 타입 : float(4), double(8)
논리 타입 : boolean(1)
참조내용:
그렇다면 char는 대체 어떻게 저장되는 것일까요?
사람과 컴퓨터가 언어를 교환하기 위해서 만들어진 코드가 있는데요. 대표적으로는 아스키코드(ASCII code)와 유니코드(unicode)가 있습니다. 따라서 우리가 char형 변수의 문자를 선언하게 되면, 해당 문자는 아스키코드의 규칙에 맞게 숫자로 치환이 되어 컴퓨터에 저장되게 됩니다.
2. 문자[형,형,...]열?
- String은 문자 열을 나타내는 *참조형 타입(Reference Type)의 중 하나다.
- 단순히 데이터 유형 중 하나가 아니라는 것
- 이 개념 부분에서 큰 차이점이 있다. 참조형이라는 것.
- "아 그냥 URL링크처럼 연결시키는거네 뭐" 하고 이후 자세한 이론을 대충 이해하고 넘어갔었다.
데이터의 참조 타입(Reference Type)
종류
배열 : Array(4)
열거 : Enumeration(4)
클래스 : Class(4)
인터페이스 : Interface(4)
객체의 주소값을 저장하기때문에 4byte
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EB%B3%80%EC%88%98%EC%9D%98-%EA%B8%B0%EB%B3%B8%ED%98%95-%EC%B0%B8%EC%A1%B0%ED%98%95-%ED%83%80%EC%9E%85
말 그대로 참조다.
그 이유는 참조, 마치 홈페이지 링크를 걸어둔 것 처럼 참조되어 있어서,
주소값(어떤 것을 가르키는 주소) 만 저장 되기 때문이다.
문자형 들이 들어있는 배열이라 생각해야 한다.
'안녕'이란 텍스트를 출력하는 방법은
'안'과'녕'을 char타입으로 a,b선언하고 a+b하는 방법이고
char타입은 '안녕'을 선언 할 수 없다. Character만 허용하기 때문이다.
그럼 '안녕'과 같은 문자열을 String으로 선언한다는 것은
문자형 2개를 가진 배열 객체를 생성하는 것이다.
그런데 조심해야 할 것이 있다.
String으로 객체를 생성 할 때
String c = new String("안녕");
은 같은 값을 출력한다.String e = "안녕";
하지만
이것들이 완벽하게 같을까?
주소값이라는것을 이해하려면 변수를 할당 할 때 저장되는 메모리 구조를 좀 더 공부해야된다.String c = new String("안녕"); String d = new String("안녕"); String e = "안녕"; String f = "안녕";
Static
JAVA 파일은 크게 필드(field), 생성자(constructor), 메소드(method)로 구성된다. 그중 필드 부분에서 선언된 변수(전역변수)와 정적 멤버변수(static이 붙은 자료형) Static 영역에 데이터를 저장한다. Static 영역의 데이터는 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있게 된다.
Stack
기본 자료형(int, double, byte, long, boolean 등)에 해당되는 지역변수(매개 변수 및 블럭문 내 변수 포함)의 데이터의 값이 저장되는 공간이 Stack(스택) 영역이다. 해당 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다.
Heap
인스턴스를 생성하는 방법은 "클래스 변수 = new 클래스();" 객체
참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열 등은 Heap 영역에 데이터가 저장된다. 이때 변수(객체, 객체변수, 참조변수)는 Stack 영역의 공간에서 실제 데이터가 저장된 Heap 영역의 참조값(reference value, 해시코드 / 메모리에 저장된 주소를 연결해주는 값)을 new 연산자를 통해 리턴 받는다. 다시 말하면 실제 데이터를 갖고 있는 Heap 영역의 참조 값을 Stack 영역의 객체가 갖고 있다. 이렇게 리턴 받은 참조 값을 갖고 있는 객체를 통해서만 해당 인스턴스를 핸들 할 수 있다.
https://m.blog.naver.com/heartflow89/220954420688
으로 우선 이해를 하자.
다시 정리하면 String은 배열이기 때문에
생성 할 때 위 메모리 구조가 별도로 생성되고, '안'이라는 기본자료1개, '녕'이라는 기본자료 1개 총 2개가 Stack에 저장된다.
또한, 각 메모리의 Heap에서는 각 Stack을 연결해주는 주소값이 저장된다.
그래서, c와 d는 New를 통해 새로운 객체를 생성해서 서로 다른 별개의 메모리 공간을 생성한 것이고 주소가 다를 수 밖에 없다.
하지만 e와 f는 같이 직접 String에 리터럴(값==데이터)을 입력해서 생성하면 같은 메모리 공간에서 Stack에 1번지 2번지 처럼 2개의 데이터가 저장되어 사실 주소값이 같은 것이다.
이는 마치 건물로 생각하면 New를 통해 생성한 String 객체는 단독 주택으로 주소가 완전 다른 상태이며
String 에 값을 직접입력하여 생성한 객체는 아파트로 1동의 201호, 202호처럼 아파트 동 주소는 같은 상태라고 보면 된다.
나와 동일한 고민을 했던 개발자님의 블로그이다. 완벽하게 동일하게 가끔 주소값이 출력되는 것에 대해서 개념을 파악하고 있지 못해서 뭐지? 하고 넘어간 상황까지도 똑같다. 개념을 알기 쉽게 정리했다.
두개의 차이를 인지했지만 정확하게 어떻게 다른지 메모리 구조적으로 설명해주신 개발자님의 블로그이다. 이것을 보고나서 좀 더 명확하게 왜 이런 차이가 발생하는지 이해하게 되었다.
https://colossus-java-practice.tistory.com/7
내가 원하는 정보가 잘 정리된 개발자 블로그이다. 간단 명료하게 정리되어 있다.
해당 Java 기초 연습은 아래 깃허브를 통해 업로드 됩니다.
https://github.com/yzpocket/ohnyong_java_excercise
'Java & Algorithm > Java' 카테고리의 다른 글
[JAVA] 기초문법 - 타입 형변환(Type Conversion) - 10 (0) | 2023.07.25 |
---|---|
[JAVA] 기초문법 - bit, byte, 2진수, 10진수 - 09 (0) | 2023.07.25 |
[JAVA] 기초문법 - ✅️JVM? = 공통 실행 환경(Compile-time, Run-time) - 07 (0) | 2023.07.24 |
[JAVA] 기초문법 - "JAVA 개발 환경을 구축한다." 라는 의미와 "JRE는 그럼 뭔지?" 까지 - 06 (0) | 2023.07.24 |
[JAVA] 기초문법 - Java란? 개발 언어 역사와 특징 요약 - 05 (0) | 2023.07.24 |