JAVA 자료형: 문자와 문자열
안녕하세요. 😀 오늘은 JAVA의 자료형에서 문자와 문자열에 대해 포스팅해보도록 하겠습니다.
들어가기 전에...
저번 함수와 변수 포스팅에서 변수를 포스팅했을 때, 데이터의 종류로 기초 자료형과 참조 자료형에 대해 다루어 보았습니다.
기초 자료형 : primitive type
숫자
정수
Byte byte 1byte(8bit)
Short short 2byte(16bit)
Integer int 4byte(32bit)
Long long 8byte(64bit)
실수
Float float 4byte(32bit)
Double double 8byte(64bit)
문자
Character char 2byte(16bit)
- 양의 정수로, 16bit이며 문자를 다루기 때문에 음수를 가질 수 없다.
논리
Boolean boolean 1byte(8bit)
참조 자료형 : reference type
객체
문자열
배열
인터페이스
기초 자료형과 참조 자료형의 차이는 기초자료형은 변수가 값을 직접 가르키는 반면,
참조 자료형은 변수가 값을 직접 가르키지 않고, 객체를 가리킵니다.
- 해당 객체안에 데이터를 담고 있습니다.
알아두면 좋은 사항 : JVM에서 컴파일할 때, JAVA는 어떤 데이터 자료형으로 들어와도 int 밖에 모릅니다.
형변환
기초자료형에서 숫자로 사용되는 데이터 타입은 서로 데이터를 주고 받을 수 있습니다.
그러나, 각 자료형의 byte와 bit는 다릅니다.
따라서, 자료형을 변환할 때, 이 점을 신경써서 변환해야 할 필요가 잇습니다.
묵시적 형변환 vs 명시적 형변환
기초 자료형을 byte 크기 순으로 작은 순서부터 큰 순서까지 나열하면 다음과 같습니다.
byte - char - short - int - float - double
왼쪽에서 오른쪽으로 자료형을 변환하는 것은 byte가 작은 자료형을 byte가 큰 작은 자료형으로 변환하는 것이기 때문에 자료형 변수 = 변수; 이런 식으로 사용해도 큰 문제가 생기지 않습니다. 이러한 형변환을 묵시적 형변환이라고 합니다.
반대로, 오른쪽에서 왼쪽으로 자료형을 변환하는 것은 byte가 큰 자료형을 byte가 작은 자료형으로 변환하는 것이기 때문에 캐스팅 연산자를 써주어야 합니다. 이렇게 캐스팅 연산자를 사용하여, 형변환을 하는 것을 명시적 형변환이라고 합니다.
형변환 예시
클래스와 메소드 생략...
// 묵시적 형변환 예시
char ch1='A';
int intCh1=ch1;
// 명시적 형변환 예시
int i=32;
char chi=(char)i;
- 명시적 형변환의 경우, (char)와 같은 캐스팅 연산자를 사용해 주어야 합니다.
문자와 문자열
오늘 주로 포스팅할 내용은 기초 자료형인 문자 char와 참조 자료형인 문자열 String입니다.
프로그램을 구현할 때 대부분 문자열을 활용하기 때문에, 가장 중요한 자료형이라고 볼 수 있습니다.
String은 char의 집합이자 배열이다.
예시로, "velog"라는 단어가 있을 때, 'v','e','l','o','g'은 char이지만, char들을 조합하면 "velog"라는 String이 완성됩니다. 따라서, String은 char의 집합이지 배열이라고 볼 수 있습니다.
참고 : charAt
String의 문자열을 한 글자씩 char 문자형으로 String 글자 중 원하는 위치의 글자를 출력할 수 있습니다.
Modifier and Type | Method and Description |
---|---|
char | charAt(int index) : Returns the char value at the specified index. |
배열
배열이란 데이터를 순차적으로 관리하는 객체입니다.
- 순차적으로 관리한다는 것은 index별로 관리한다는 것과 같습니다.
배열의 종류로는 1차원 배열, 2차원 배열, 가변 배열 등등이 있습니다.
1차원 배열 3가지 출력 방법
데이터형 참조변수[] 배열연산자 = new 데이터형 [배열이 들어갈 공간] 배열연산자;
데이터형 참조변수[] = new 데이터형[]{};
데이터형 참조변수[]={};
1차원 배열 출력 실습 코드
package a.b.c.ch1;
public class Array_practice{
public void array_test(){
// 1번째 방법
char cArray[]={'v','e','l','o','g'};
// char 데이터 타입 배열 만들기
// [] 형식이 아니라 {} 형식으로 한 다음
// cArray[n]을 호출하면 n 인덱스에 해당하는 value가 출력된다.
System.out.println("cArray[0] : >>> "+cArray[0]+"\n");
System.out.println("cArray[1] : >>> "+cArray[1]+"\n");
System.out.println("cArray[2] : >>> "+cArray[2]+"\n");
System.out.println("cArray[3] : >>> "+cArray[3]+"\n");
System.out.println("cArray[4] : >>> "+cArray[4]+"\n");
// 배열에서 인덱싱할 때는 []을 사용한다.
// 2번째 방법
String velog=new String(cArray);
// cArray 배열을 String 객체로 선언 []이 아닌 ()으로 쓴다.
System.out.println("velog.charAt(0) : >>> "+velog.charAt(0)+"\n");
System.out.println("velog.charAt(1) : >>> "+velog.charAt(1)+"\n");
System.out.println("velog.charAt(2) : >>> "+velog.charAt(2)+"\n");
System.out.println("velog.charAt(3) : >>> "+velog.charAt(3)+"\n");
System.out.println("velog.charAt(4) : >>> "+velog.charAt(4)+"\n");
// velog는 String 변수 이므로, charAt(int)를 통해
// 출력한다.
// String에서 인덱싱 할 때는 ()를 사용한다.
// 3번째 방법
String velog_2=new String("velog");
// String안에 배열을 집어넣는게 아니라 velog라는 글자 자체를 집어 넣는다.
System.out.println("velog_2.charAt(0) : >>> "+velog_2.charAt(0)+"\n");
System.out.println("velog_2.charAt(1) : >>> "+velog_2.charAt(1)+"\n");
System.out.println("velog_2.charAt(2) : >>> "+velog_2.charAt(2)+"\n");
System.out.println("velog_2.charAt(3) : >>> "+velog_2.charAt(3)+"\n");
System.out.println("velog_2.charAt(4) : >>> "+velog_2.charAt(4)+"\n");
// 4번째 방법
String velog_3="velog";
// new String이 아닌 글자 자체를 String 변수로 할당하는 방법
System.out.println("velog_3.charAt(0) : >>> "+velog_3.charAt(0)+"\n");
System.out.println("velog_3.charAt(1) : >>> "+velog_3.charAt(1)+"\n");
System.out.println("velog_3.charAt(2) : >>> "+velog_3.charAt(2)+"\n");
System.out.println("velog_3.charAt(3) : >>> "+velog_3.charAt(3)+"\n");
System.out.println("velog_3.charAt(4) : >>> "+velog_3.charAt(4)+"\n");
} // end of array_test method
public static void main(String args[]){
// 함수가 static 수정자 키워드가 없으므로 객체를 생성하여 출력
new Array_practice().array_test();
} // end of main method
} // end of Array_practice class
위와 같은 코드를 입력하고 컴파일 후 실행하면 다음과 같은 결과가 출력됩니다.
String 클래스를 초기화 하는 방법
String 클래스를 초기화 하는 방법은 "", null이 있습니다.
String을 초기화 하는 첫 번째 방법은 ""입니다.
String str0="";
위의 코드로 빈문자열로 초기화 할 수 있습니다.
유의사항
문자열 String이 아닌 문자 Char의 경우, char str=' ';으로 빈문자열로 초기화 합니다.
추가적으로 char에서는 ' '와 같이 작은 따옴표를 사용하고, String에서는 " "와 같이 큰 따옴표를 사용합니다.
String을 초기화 하는 두 번째 방법은 null입니다. null은 String의 default 값으로 데이터가 없다는 의미입니다. String을 null로 초기화 할 때와, ""으로 초기화 할 때의 차이를 비교해보고,
Array_practice 예제에서 String은 "velog"로 띄어쓰기 없이 charAt 명령어를 통해 각 char를 출력했었는데, velog에 띄어쓰기를 추가한다면 어떠한 일이 벌어지는지도 코드를 통해 실습해보도록 하겠습니다.
String 클래스 초기화 실습 및 띄어쓰기가 포함된 String 실습 코드
package a.b.c.ch1;
public class Str_practice_2{
public void stringTest(){
System.out.println("stringTest method 시작");
// String 세 가지 실험
// 빈문자열로 초기화 하는 방법
// 첫 번째 방법
String str0="";
// 두 번재 방법
String str1=null;
// 띄어쓰기와 글자 섞어서 쓰기
String str2=" ve l og";
System.out.println("str0.length() >>> "+str0.length()+"\n");
System.out.println("str2.length() >>> "+str2.length()+"\n");
// 공식문서를 보면 length()는 public int length()임.
// 따라서, int 변수 = 변수.length();로 지정해줄 수도 있음.
int str0_0=str0.length();
int str2_0=str2.length();
System.out.println("int 변수 = 변수.length() 지정 str0.length() >>> "+str0_0+"\n");
System.out.println("int 변수 = 변수.length() 지정 str2.length() >>> "+str2_0+"\n");
// length() 쓰지않고 그냥 출력해보기
System.out.println(" 큰 따옴표 초기화 >>> "+str0+"\n");
System.out.println(" null 초기화 >>> "+str1+"\n");
System.out.println("ve l og >>> "+str2+"\n");
// 마지막으로 charAt로 한 글자 분리해서 살펴보기
System.out.println("ve l og 분리해서 보기 >>> "+str2.charAt(1)+"\n");
} // end of stringTest method
public static void main(String args[]){
new Str_practice_2().stringTest();
} // end of main method
} // end of Str_practice_2 class
- 참고 : 변수.length()는 string 변수의 길이를 출력하여 줍니다.
위의 코드를 실행했을 경우, 다음과 같은 결과가 출력됩니다.
Q. str2에 대입한 velog는 5글자인데 왜 length()는 8이라고 출력할까요?
A. String str2=" ve l og";에서 사람이 볼 때는 5글자이지만, 컴퓨터 입장에선 띄어쓰기까지 글자수로 계산하기 때문입니다. (왜 String str0=" "; 초기화가 아닌 String str0=""; 초기화인지 아시겠죠?)
NullPointer Exception error
null로 초기화 한 변수 length() 출력 오류
코드를 보다보면, ""으로 초기화한 변수는 str0.length() 명령어가 있는데,
null으로 초기화한 변수는 str1.length() 명령어가 없는 것을 확인 할 수 있습니다.
System.out.println("str1.length() >>> "+str1.length()+"\n");
str0.length() 명령어 아래 위의 코드를 추가하여 실행하면, 어떤 일이 발생할까요?
javac 명령어로 컴파일은 되지만, 실행이 되지 않습니다.
null로 초기화한 변수 int 변수 = 변수.length() 출력 오류
java의 API를 보면 length()는 public int length()인 것을 볼 수 있습니다.
Modifier and Type | Method and Description |
---|---|
int | length() : Returns the length of this string. |
따라서, int 변수 = 변수.length();으로 지정해줄 수도 있습니다.
int str0_0=str0.length();
위의 코드에서 ""으로 초기화한 변수의 길이를 출력하는 것을 확인 할 수 있었습니다.
마찬가지 이유로 int str1_0=str1.length(); 명령어를 사용하여 null으로 초기화한 변수의 길이를 출력시키면 NullPointerException 에러로 실행 불가합니다.
length() 명령어 없이 출력해보기
마지막으로, length() 명령어 없이 출력하면
아무 문제 없이 잘 출력 되는 것을 확인 할 수 있습니다.
""초기화의 경우 아무것도 출력되지 않았고, null로 초기화 할 경우 null이 출력되는 것을 확인 할 수 있었습니다.
System.out.println("ve l og 분리해서 보기 >>> "+str2.charAt(1)+"\n")
마지막으로, " ve l og"는 분리해서 2번째 글자를 출력하면 e가 아닌 v가 나오는 것을 볼 수 있습니다.
이상으로 JAVA 자료형 : 문자와 문자열 포스팅을 마치도록 하겠습니다. 😁
Author And Source
이 문제에 관하여(JAVA 자료형: 문자와 문자열), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yunyoseob/JAVA-자료형-문자와-문자열저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)