Yoon DevLog
article thumbnail

 

논리형 자료형

논리형에는 'boolean' 한가지 밖에 없다. boolean형 변수에는 true와 false 중 하나를 저장할 수 있으며, 기본 값은 false이다.

논리형 타입 할당되는 메모리의 크기 데이터 표현 범위
boolean 1byte true,false

boolean 자료형은 대소문자를 구분한다.

 

boolean one = true;
boolean two = False; // Error!, true 또는 false만 가능

 

주로 대답(yes/no) , 스위치(on/off) 등과 같은 논리구조에 주로 사용된다.

int realHeight = 80;
int fakeHeight = 60;

if(realHeight > fakeHeight){
    System.out.println("실제 몸무게가 더 무겁습니다!");
}

 

 


문자 자료형

문자형 역시 'char' 한 가지 자료형밖에 없다. char타입의 변수는 단 하나의 문자만을 저장할 수 있다.

문자형 타입 할당되는 메모리의 크기 데이터 표현 범위
char 2byte 0 ~ 65,535

또한, char 타입은 문자값을 표현하는 방식이 다양하다.

char a1 = 'a'; // 문자로 표현
char a2 = 97; // 아스키코드로 표현
char a3 = '\u0061'; // 유니코드로 표현

System.out.println(a1);  // a 출력
System.out.println(a2);  // a 출력
System.out.println(a3);  // a 출력

 

만일 어떤 문자의 유니코드를 알고 싶으면, char형 변수에 저장된 값을 정수형(int)으로 변환하면 된다.

int code = (int)a1; // a1에 저장된 값을 int 타입으로 변환하여 저장

 

 


문자열 자료형

문자열이란 문자가 나열된 문장을 뜻한다. 

C언어에서는 문자열을 char형 배열로 표현하지만, 자바에서는 문자열을 위한 String이라는 클래스를 별도로 제공한다.

하지만 String 클래스 구성 내부 요소를 보자면 결국 String도 char[] 배열로 이루어진 데이터 자료라고 볼 수 있다.

public final class String implements java.io.Serializable, Comparable {
	/* The value is used for character storage */
    priave char[] value; 
    // ...
}

 

String 자료형은 boolean, byte, short, int, long, float, double, char와 달리 참조(reference) 자료형으로 분류 된다.

그리고 가장 대표적인 성질은 불변의 속성을 가진다는 것이다.

String str = "Hello";   // 예를들어 초기 str의 값이 할당되어있던 메모리의 주소값은 A라고하자
str = str + " World!";  // 기존의 str에 문자열 연산이 이뤄지면 새로운 메모리의 주소값 B를 바라본다
                        // 이렇게되면 A는 HEAP영역에서 참조가 사라지게되고 GC에 의해 삭제된다.

이를 해결하기위해 StringBuffer, StringBuilder을 사용하면 된다! 이는 추후에 자세하게 다뤄보겠다! 

또한 String 클래스에는 문자열과 관련된 작업을 할 때 유용하게 사용할 수 있는 다양한 메소드가 포함되어 있다!

 

메서드 설  명
String(String s) 주어진 문자열( s )를 갖는  String 인스턴스 생성
String(char[ ] value) 주어진 문자열( char 배열인  value )를 갖는  String 인스턴스 생성
String(StringBuffer buf)  StringBuffet 인스턴스인  buf 가 갖고있는 문자열과 같은 내용의  String 인스턴스 생성
char charAt(int index) 지정된 위치( index , 0부터 시작)에 있는 문자를 알려준다.
int compareTo(String str) 문자열( str )과 사전순서로 비교한다.
(같으면  0 , 이전이면  음수 , 이후면  양수 (떨어진 숫자만큼)를 반환)

int i = "a".compareTo("a"); → 0반환
int i2 = "a".compareTo("c"); → -2반환
int i3 = "e".compareTo("a"); → 4반환
String concat(String str) 문자열( str )을 뒤에 덧붙임
boolean contains(CharSequence s) 지정된 문자열( s )이 포함되었는지 검사
boolean endsWith(String suffix) 지정된 문자열( suffix )로 끝나는지 검사
boolean equals(Object obj) 매개변수로 받은 문자열( obj )과  String 인스턴스의 문자열을 비교
(문자열이 다르거나  Obj 가  String 이 아닌경우  false 를 반환)
boolean equalsIgnoreCase(String str) 대소문자의 구분없이  String 인스턴스의 문자열을 문자열( str )과 비교
int indexOf(int ch) 주어진 문자( ch )가 문자열에 존재하는지 확인하여 위치( index )를 반환
(index는 0부터 시작하고, 못찾으면 -1을 반환)
int indexOf(int ch, int pos) 주어진 문자( ch )가 문자열에 존재하는지 지정된위치( pos )부터 확인하여 위치( index )를 알려준다. (index는 0부터 시작하고, 못찾으면 -1을 반환)
int indexOf(String str) 주어진 문자열( str )이 존재하는지 확인하여 그 위치( index )를 반환
(index는 0부터 시작하고, 못찾으면 -1을 반환)
String intern( ) 문자열을 상수풀(constant pool)에 등록
이미 상수풀에 같은 내용의 문자열이 있을 경우에는 그 문자열의 주소값을 반환
int lastIndexOf(int ch) 지정된 문자 또는 문자코드( ch )를 오른쪽 끝에서부터 찾아 위치( index )를 반환
(못찾으면 -1을 반환)
int lastIndexOf(String str) 지정된 문자열( str )을 인스턴스의 문자열 끝부터 찾아 위치( index )를 반환
(못찾으면 -1을 반환)
int length( ) 문자열의 길이 반환
String replace(char old, char nw) 문자열 중의 문자( old )를 새로운 문자( nw )로 모두 바꾼 문자열을 반환
String replace(CharSequence old, CharSequence nw) 문자열의 문자열( old )을 새로운 문자열( nw )로 모두 바꾼 문자열을 반환
String replaceAll(String regex, String replacement) 문자열 중에서 지정된 문자열( regex )와 일치하는 것을 새로운 문자열( replacement )로 모두 변경
String replaceFirst(String regex, String replacement) 문자열 중에서 지정된 문자열( regex )와 일치하는 것중, 첫번째 것만 새로운 문자열( replacement )로 변경
String[ ] split(String regex) 문자열을 지정된 분리자( regex )로 나누어 문자열 배열에 담아 반환

String s1 = "one,two,three";
String[ ] s2 = s1.split(","); → s2배열에 ,를 기준으로 나뉜 3개의 배열이됨
String[ ] split(String regex, int limit) 문자열을 지정된 분리자( regex )로 나누어 문자배열에 담아 반환하되 문자열 전체를 지정된 개수( limit )로 나눈다.

String s1 = "one,two,three";
String[ ] s2 = s1.split(",", 2); → s2배열에 ,를 기준으로 나누되 2개의 배열이 됨
String[] join(String regex, String[] str) 문자열 배열을 하나의 문자열로 합치는데, 구분자를 넣어 각 요소를 구분해줄 수 도 있다.
boolean startsWith(String prefix) 주어진 문자열( prefix )로 시작하는지 검사
String substring(int begin)
String substring(int begin, int end)
주어진 시작위치( begin )부터 끝위치( end )범위에 포함된 문자열을 얻는다.
(※ 시작위치는 포함되지만 끝위치는 포함되지 X ,  begin <= x < end )
String toLowerCase( )  String 인스턴스에 저장되어 있는 모든 문자열을 소문자로 변환하여 반환
String toUpperCase( )  String 인스턴스에 저장되어 있는 모든 문자열을 대문자로 변환하여 반환
String trim( ) 문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환.
(문자열 중간에 있는 공백은 제거되지 X)
String toString( )  String 인스턴스에 저장되어 있는 문자열을 반환
static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(int i)
static String valueOf(long l)
static String valueOf(float f)
static String valueOf(double d)
static String valueOf(Object o)
지정된 값을 문자열로 변환하여 반환
참조변수의 경우,  toString( ) 을 호출한 결과를 반환

 

 


정수 자료형

정수형에는 모두 4개의 자료형이 있으며, 각 자료형이 저장할 수 있는 값의 범위가 서로 다르다.

정수형 타입 할당되는 메모리의 크기 데이터의 표현 범위
byte 1바이트 -128 ~ 127
short 2바이트 -215 ~ (215 - 1)
-32,768 ~ 32,767
int 4바이트 -231 ~ (231 - 1)
-2,147,483,648 ~ 2,147,483,647
long 8바이트 -263 ~ (263 - 1)
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
현업에서는 주로 int, long을 사용한다. 이유는 다음과 같다.
1. int보다 크기가 작아서 메모리를 조금 더 절약할 수 있지만, 저장할 수 있는 값의 범위가 작은 편이라서 오류가 발생하기 쉽다.
2. JVM의 피연산자 스택(operand stack)이 피연산자를 4byte 단위로 저장하기 때문에 크기가 4byte보다 작은 자료형의 값을 계산할 때는 4byte로 변환하는 작업이 추가된다. 때문에 오히려 int를 사용하는 것이 더 효율적이다.
 
그렇기에 보통 21억 미만의 수다 싶으면 int를 사용하고, 그 이상일 경우 long을 사용하면 된다.
추가로 long 변수에 int 자료형의 최대값보다 큰 경우 값 뒤에 접미사 L을 붙여줘야한다. 만약 L을 안붙이게 될 경우 컴파일 에러가 발생한다.
long veryBigNumber = 214748364999L;

 

정수형의 오버플로우

정수형 데이터 타입을 사용할 때에는 데이터의 최소/최대 크기를 고려해야 한다.

표현할 수 있는 범위를 벗어난 데이터를 저장하게 되면, 오버플로우가 발생해 오류 발생하기 쉽상이다.

 

✔︎ 오버플로우 : 해당 타입이 표현할 수 있는 값의 범위를 넘어서는 것 

✔︎ 언더플로우 : 해당 타입이 취급할 수 있는 수의 범위 보다 작아지는 상태

 

 


실수 자료형

실수형은 실수를 저장하기 위한 타입으로 float, double 두가지가 있다.

실수형 타입 할당되는 메모리의 크기 데이터의 표현 범위 리터럴 타입 접미사 정밀도
float 4바이트 (3.4 X 10^-38) ~ (3.4 X 10^38) F 또는 f 7자리
double 8바이트 (1.7 X 10^-308) ~ (1.7 X 10^308) D 또는 d (생략 가능함) 15자리

컴퓨터에서는 소수를 이진법으로 표현할때 고정 소수점 방식 이 아닌 부동 소수점 방식을 이용한다.

 

부동 소수점 방식을 사용하면 매우 큰 범위의 실수까지도 표현할 수 있어 보다 정밀하게 소수를 표현할수는 있지만 그래도 완전히 정확하게 표현하는 것이 아니라서, 소수 연산에 있어 부정확한 실수의 계산값을 초래하게 된다. 오차가 필연적으로 발생하게 된다는 뜻이다.

연산 속도의 향상이나 메모리를 절약하려면 float를 선택하고, 더 큰값의 범위라던가 더 높은 정밀도를 필요로 한다면 double을 선택해야 한다.

 

실수형의 오버플로우

실수형에서도 변수의 값이 표현범위의 최대값을 벗어나면 '오버플로우'가 발생한다.
정수형과 달리 실수형에서는 오버플로우가 발생하면 변수의 값은 '무한대(infinity)'가 된다.

✔︎ 오버플로우 : 무한대(infinity)

✔︎ 언더플로우 : 양의 최소값보다 작은 값이 되는 경우 -> 변수 의 값이 0이 된다.

 

 

 


#참고자료

 

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B8%B0%EB%B3%B8-%EC%9E%90%EB%A3%8C%ED%98%95-%EC%A2%85%EB%A5%98-%EC%B4%9D%EC%A0%95%EB%A6%AC-int-double-char-String#string_%ED%81%B4%EB%9E%98%EC%8A%A4

 

[JAVA] ☕ 데이터 타입 기본 정리 (int / double / char / String / boolean)

정수 자료형 자바의 정수를 표현하기 위한 자료형은 대표적으로 int, long 이 있다. (byte, short 도 있지만 잘 사용하지 않는다.) 정수형 타입 할당되는 메모리의 크기 데이터의 표현 범위 byte 1바이트

inpa.tistory.com

자바의 정석(남궁성 지음)

profile

Yoon DevLog

@usnooy._.

백엔드 개발자 성장일기 -