자료형(data type)이란 데이터의 종류와 크기를 결정하는 기본 구성 요소로 숫자, 문자열처럼 자료 형태로 사용하는 모든 것을 뜻한다.
프로그램에서 가장 기본적이면서 핵심 단위가 되는 것이 바로 자료형이다.
숫자
- 정수
정수를 표현하는 자료형은 int, long 이다. 둘은 표현할 수 잇는 숫자의 범위에 차이가 있다.
byte와 short 등도 있지만 잘 사용하지 않음.
자료형 표현범위
int | -2147483648 ~ 2147483647 |
long | -9223372036854775808 ~ 9223372036854775807 |
byte는 -128 ~ 127까지
short는 -32768 ~ 32767까지 값을 가질 수 있으므로
특정 상황에서 효율적인 메모리 사용이 필요한 경우 사용한다.
int와 long을 사용한 예
int age = 10;
int countOfSter = 8764827384923849L;
long을 사용할 때 L을 붙여주어야 한다. 붙이지 않으면 컴파일 오류가 난다.
- 실수
자바에서 실수를 표현하는 자료형은 float와 double이다.
자료형 표현 범위
float | -3.4 * 10^38 ~ 3.4 * 10^38 |
double | -1.7 * 10^308 ~ 1.7 * 10^308 |
float와 double을 사용한 예
float pi = 3.14F;
double morePi = 3.14159265358979323846;
정수와 같이 float 변수 값을 대입할 때는 접미사로 F를 붙여 주어야 한다.
실수는 지수 표현식으로 다음과 같이 사용도 가능
double d1 = 123.4;
double d2 = 1.234e2;
d1과 d2의 값은 123.4로 같다. d2의 e2는 10의 제곱($10^2$)을 의미한다.
즉, $1.234∗10^2$이 되어 123.4가 되는 것이다.
- 8진수와 16진수
8진수와 16진수는 int 자료형을 사용한다.
숫자 0으로 시작하면 8진수
숫자 0과 x 알파벳으로 시작하면 16진수가 된다.
예시를 보자
int octal = 023; // 십진수 : 19
int hex = 0xc; // 십진수 : 12
- 숫자 연산
+, -, *, / 기호를 이요하여 두 숫자 간의 사칙연산을 수행한다.
% 나머지 값
- 증감연산
++, -- 기호를 이용하여 증가 또는 감소 시킬 수 있음
이를 증감 연산자 라고함.
int i = 0;
int j = 10;
i++;
j--;
System.out.println(i); // 1 출력
System.out.println(j); // 9 출력
다른 예시
int i = 0;
System.out.println(i++); // 0 출력
System.out.println(i); // 1 출력
i++ : 값을 참조한 후에 증가
++i : 값을 참조하기 전에 증가
불
참(true) 또는 거짓(false)의 값을 갖는 자료형을 불(boolean) 자료형이라고 함.
대입되는 값은 참 또는 거짓만 가능
예
boolean isSuccess = true;
boolean isTest = false;
- 불 연산
불 자료형에서는 불 연산의 결괏값을 대입할 수 있다.
예를 살펴보자
2 > 1 //참
1 == 2 // 거짓
3 % 2 == 1 //참
"3".equals("2") //거짓
결과는 참 또는 거짓이므로 if문과 같은 조건문에 사용하거나 불 자료형에 대입할 수 있다.
- 불 연산 사용 예 조건문
예시 1)
int base = 180;
int height = 185;
boolean isTall = height > base;
if (isTall) {
System.out.println("키가 크다");
}
isTall에 저장된 값이 참이면 “키가 크다”를 출력함
예시 2)
int i = 3;
boolean is Odd = i % 2 == 1;
System.out.println(isOdd); // true
i % 2 == 1은 i를 2로 나누었을 대 나머지가 1인지 묻는 조건문 나머지는 1이므로 참이되어 true값을 갖는다.
문자
문자 자료형은 char를 사용한다.
char a1 = 'a'; // 문잣값 앞뒤를 단일 인용 부호 ''로 감싸 주어야 한다.
char 자료형은 사실 프로그램 작성할 때 많이 사용하진 않음
활용성은 적지만 문잣값을 표현하는 방식은 다양하므로 사용할 때 주의하자.
char a1 = 'a'; //문자로 표현
char a2 = 97; //아스키코드로 표현
char a3 = '\\u0061'; //유니코드로 표현\\
// 모두 출력 a
문자열
문자로 구성된 문장을 뜻함.
"Happy Java"
"a"
"123"
자바에서 문자열을 나타내는 자료형은 String이다. 앞의 문자열을 자바에서 표현해보기.
String a = "Happy Java"; // 문자열의 앞과 뒤는 쌍따옴표("")로 감싸주어야 한다.
String b = "a";
String c = "123";
다음과 같이 표현도 가능
String a = new String("Happy java");
String b = new String("a");
String c = new String("123");
✅ new 키워드는 객체를 만들 때 사용한다.
문자열을 표현할 때는 가급적이면 첫 번째 방식, 즉 리터럴(literal) 표기 방식을 사용하는 것이 좋다.
리터럴 표기 방식은 가독성이 좋고 컴파일할 때 최적화에 도움을 준다.
- 리터럴 표기 방식 이해하기
String a = "Happy Java" 와 String b = new String("Happy Java")에서 a,b 변수는 같은 문자열 값을 갖게 되지만 완전히 동일하지는 않다.
첫 번째 코드는 리터럴(literal)표기 방식이라고 하는데 객체를 생성하지 않고 고정된 값을 그대로 대입하는 방법을 말한다.
두 번째 방식은 항상 새로운 String 객체를 만든다.
- 원시 자료형
int, long 등등 앞에서 보았던 자료형들을 원시(primitive) 자료형 이라고 한다.
원시 자료형은 new 키워드로 값을 생성할 수 없다.
원시 자료형은 다음 리터럴 표기 방식으로만 값을 세팅할 수 있다.
String은 리터럴 표시 방식을 사용할 수 있지만, 원시 자료형에 포함되지 않는다.
- Wrapper 클래스
빨간색 친 두 자료형을 제외하고는 앞 문자를 대문자로 바꿔주기만 하면 됨.
멀티 스레드 환경에서 동기화를 지원하려면 원시 자료형 대신 Wrapper 클래스를 사용해야함.
- 문자열 내장 메서드
String 자료형 중 내장 메서드 중에 자주 사용하는 것 알아보기.
String 자료형의 내장 메서드는 문자열 객체에 속한 함수
문자 합치기, 분할, 대소문자 변환 등의 문자열에 다양하게 활용할 수 있도록 도와주는 역할함.
1) equals
문자열 2개가 같은지 비교하여 결과값을 리턴한다.
String a = "hello";
String b = "java";
String c = "hello";
System.out.println(a.equals(b)); // false 출력
System.out.println(a.equals(c)); // true 출력
이처럼 문자열 값을 비교할 때는 반드시 equals를 사용한다.
만약 == 연산자를 사용한다면 다음과 같은 결과가 나옴.
String a = "hello";
String b = new String("hello");
System.out.println(a.equals(b)); // true
System.out.println(a == b); // false
문자열 a와 b는 값은 동일하지만
== 연산자를 사용하면 false를 리턴한다. a와 b는 값은 같지만 서로 다른 객체이기 때문이다.
== 은 2개의 자료형이 같은 객체일지를 판별할 때 사용하는 연산자.
2) indexOf
특정 문자열이 시작되는 위치를 리턴한다.
문자열 a에서 java가 시작되는 위치를 알고 싶다면 다음과 같이 위치를 리턴받을 수 있다.
String a = "Hello Java";
System.out.println(a.indexOf("Java"); // 6 출력
문자열 Hello Java에서 특정 문자열인 Java는 일곱 번째 문자인 J부터 시작된다.
이 때 결괏값이 7이 아닌 8으로 나온 이유는 숫자를 0부터 세기 때문이다.
3) Contains
문자열에서 특정 문자열이 포함되어 있는지 여부를 리턴한다.
String a = "Hello java";
System.out.println(a.contains("Java")); // true 출력
4) charAt
charAt 메서드는 문자열에서 특정 위치의 문자를 리턴한다.
Hello Java 문자열에서 J는 여섯번째 인덱스에 위치한 무자이다.
인덱스 6으로 문자 J를 리턴받으려면 다음과 같이 사용한다.
String a = "Hello java"
System.out.println(a.charAt(6)); // "J" 출력
5) replaceAll
문자열에서 특정 문자열을 다른 문자열로 바꿀 때 사용한다.
String a = "Hello Java";
System.out.println(a.replaceAll("Java", "World"));
//Hello World 출력
6) substring
substring 메서드는 문자열에서 특정 문자열을 뽑아낼 때 사용한다.
String a = "Hello Java";
System.out.println(a.substring(0, 4)); // Hell 출력
위처럼 substring(시작 위치, 끝 위치)와 같이 코드를 짜면 문자열의 시작위치에서 끝 위치까지의 문자를 뽑아내게 된다.
단, 끝 위치의 문자는 포함이 안된다.
시작위치 <= a < 끝위치
7) toUpperCase (모두 소문자 toLowerCase)
toUpperCase 메서드는 문자열을 모두 대문자로 변경할 때 사용한다.
String a = "Hello Java";
System.out.println(a.toUpperCase()); // HELLO JAVA
8) split
split 메서드는 문자열을 특정한 구분자로 나누어 문자열 배열로 리턴함.
String a = "a:b:c:d";
String[] result = a.split(":"); // result는 {"a", "b", "c", "d"}
- 문자열 포매팅
다음 문자열 두개를 보자
"현재 온도는 18도입니다."
"현재 온도는 20도입니다."
위 두 문자열은 각각 18과 20이라는 숫자만 다를 뿐 형식은 같다.
이렇게 문자열안의 특정한 값을 바꿀 수 있게 해주는 것이 문자열 포매팅이다.
1) 숫자 바로 대입하기
문자열 포매팅은 String.format 메서드를 사용한다.
System.out.println(String.format("I eat %d apples.", 3)); // "I eat 3 apples." 출력
결괏값을 보면, 문자열 안에 정수 3을 삽입하는 방법을 보여준다.
문자열 안에서 숫자를 넣고 싶은 자리에 %d를 입력하고, 삽입할 숫자 3을 두 번째 파라미터로 전달했다.
%d 는 문자열 포맷 코드라고 한다.
2) 문자열 바로 대입하기
숫자 대신 문자열을 넣어보자
System.out.println(String.format("I eat %s apples.", "five")); // "I eat five apples." 출력
숫자는 %d 문자는 %s 를 써야한다.
3) 숫잣값을 나타내는 변수 대입하기
int number = 3;
System.out.println(String.format("I eat %d apples.", number)); // "I eat 3 apples." 출력
결과는 같지만 변수를 대입한다.
4) 값을 2개 이상넣기
int number = 10;
String day = "three";
System.out.println(String.format("I ate %d apples. so I was sick for %s days.", number, day));
5) 문자열 포맷 코드의 종류
여기서 %s 포맷코드는 어떤 형태의 값이던 변환해 넣을 수 있음.
System.out.println(String.format("I have %s apples", 3)); // "I have 3 apples" 출력
System.out.println(String.format("rate is %s", 3.234)); // "rate is 3.234" 출력
✅ 주의하기 %는 어떻게 표현할까?
System.out.println(String.format("Error is %d%%.", 98)); // "Error is 98%." 출력
%d 같은 포맷 코드가 없으면 %단독으로 써도 되지만
있으면 %를 한번 더 써주도록 하자.
- 공백 표현하기.
System.out.println(String.format("%10s", "hi")); // " hi" 출력
%10s 는 전체 길이가 10인 문자열 공간에서 대입되는 값(hi)을 가장 오른쪽에 정렬하고
나머지는 공백으로 남겨두라는 의미이다.
그럼 왼쪽 정렬은?
System.out.println(String.format("%-10sjane.", "hi")); // "hi jane." 출력
- 소수점 표현하기
System.out.println(String.format("%.4f", 3.42134234)); // 3.4213
%.4f 는 소수점 넷째 자리까지만 나타내고 싶을 때 사용한다.
문자열 포맷 코드에서 ‘.’는 소수점을 뜻하고, 그 뒤의 숫자 4는 소수점 뒤에 이어질 숫자의 개수를 말한다.
- printf
System.out.printf("I eat %d apples.", 3); // "I eat 3 apples." 출력
StringBuffer
StringBuffer는 문자열을 추가하거나 변경할 때 주로 사용하는 자료형
1) append
StringBuffer 객체를 생성하고 문자열을 생성하는 예제
StringBuffer sb = new StringBuffer(); // StringBuffer 객체 sb생성
sb.append("hello");
sb.append(" ");
sb.append("jump to java");
String result = sb.toString();
System.out.println(result); //hello jump to java
StringBuffer 자료형은 append메서드를 사용하여 문자열을 계속해서 추가해 나갈 수 있다.
그리고 toString() 메서드를 사용하면 StringBuffer를 String 자료형으로 변경할 수도 있다.
StringBuffer 대신 String을 사용하면?
String result = "";
result += "hello";
result += " ";
result += "jump to java";
System.out.println(result); // "hello jump to java" 출력
✅ 중요
두 번째 예제와 첫 번째 예제의 결과는 같지만 내부적으로 객체를 생성하고 메모리를 사용하는 과정은 다르다.
첫 번째 예제는 StringBuffer 객체를 한 번만 생성하지만,
두 번째 예제는 String 자료형에 + 연산이 있을 때 마다 새로운 String 객체를 생성하므로 총 4개의 String 자료형 객체가 만들어진다.
String 자료형은 값이 한번 생성되면 변경할 수 없다.
toUpperCase와 같은 메서드를 보면 문자열이 변경되는 것처럼 생상할 수도 있지만 해당 메서드를 수행할 때 또 다른 String 객체를 생성하여 리턴할 뿐이다.
반면에 StringBuffer 자료형은 값을 변경할 수 있으므로 생성된 값을 언제든지 수정할 수 있다.
⚡ 값을 변경할 수 없는 것을 이뮤터블(immutable)
변경할 수 있는 것을 (mutable)
그렇다면 무조건 StringBuffer를 사용하는 것이 좋을까?
StringBuffer 자료형은 String 자료형보다 무거운 편에 속한다.
new StringBuffer()로 객체를 생성하면 String을 사용할 때보다 메모리 사용량도 많고 속도도 느리다.
따라서 문자열을 추가하거나 변경하는 작업이많으면 StringBuffer, 적으면 String을 사용하는 것이 유리하다.
- StringBuilder는 ?
StringBuilder sb = new StringBuilder();
sb.append("hello");
sb.append(" ");
sb.append("jump to java");
String result = sb.toString();
System.out.println(result);
StringBuffer는 멀티스레드 환경에서 안전하고.
StringBuilder는 StringBuffer보다 성능이 우수하다는 장점이 있다.
따라서 동기화를 고려할 필요가 없는 상황에서는 Builder 사용하자
- insert
특정 위치에 원하는 문자열을 삽입할 수 있다.
insert를 사용하여 0번째 위치에 hello라는 문자열을 삽입해보자.
StringBuffer sb = new StringBuffer();
sb.append("jump to java");
sb.insert(0, "hello ");
System.out.println(sb.toString());
- substring
String 자료형의 substring 메서드와 동일하게 동작한다.
시작 위치에서 끝 위치까지의 문자를 뽑아낸다.
StringBuffer sb = new StringBuffer();
sb.append("Hello jump to java");
System.out.println(sb.substring(0, 4));
배열
1부터 10까지의 숫자 중 홀수만 모은 1, 3, 5, 7, 9라는 집합을 생각해보자. 이런 집합을 숫자나 문자열만으로 표현하기는 쉽지 않다.
이럴 때 배열 array를 사용한다. 배열은 자료형 바로 옆에 []기호를 붙인다.
int 자료형의 배열 int[]
int[] odds = {1, 3, 5, 7, 9};
String 자료형의 배열 String[]
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
- 배열의 길이 정하기
배열의 길이를 먼저 설정한 뒤 값을 나중에 대입하는 방법
**String[] weeks = new String[7];
weeks[0] = "월";
weeks[1] = "화";
weeks[2] = "수";
weeks[3] = "목";
weeks[4] = "금";
weeks[5] = "토";
weeks[6] = "일";**
배열 변수를 만들 때 7과 같은 숫잣값을 넣어 길이를 정해주지 않으면 오류 발생
- 접근하기
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
System.out.println(weeks[3]);
- 길이 구하기
배열은 보통 for문과 함께 사용한다.
배열의 길이는 length를 사용하면 된다.
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
for (int i = 0; i < weeks.length; i++) {
System.out.println(weeks[i]);
}
- 배열에서 나오는 오류 : ArrayIndexOutOfBoundsException
참고자료 :
위키독스 점프 투 자바 https://wikidocs.net/book/31
'Java' 카테고리의 다른 글
[점프 투 자바] 4장 제어문 이해하기 (0) | 2024.01.01 |
---|---|
[점프 투 자바] 3장 완결 리스트, 맵, 집합, 형변환, fianl 등 (1) | 2024.01.01 |
[점프 투 자바] 2장 자바 시작하기 (0) | 2024.01.01 |
[점프 투 자바] 1장 자바란 무엇인가? (2) | 2024.01.01 |
intelliJ Plugins Marketplace 연결 (0) | 2023.12.29 |