back_Java_03
01 - 숫자
1. 정수
int : 4바이트 표현 범위
long : 8바이트 표현 범위
long 은 값을 대입시
L
이나 소문자l
을 뒤에 붙여주어야 한다. 이를 누락 시 컴파일 에러가 발생한다.
2. 실수
float : $-3.4 * 10^{38}$ ~ $3.4 * 10^38*$까지 표현할 수 있다.
접미사로
F
혹은f
를 반드시 붙여주어야 하며, 누락 시 컴파일 에러가 발생한다.
double : $-1.7 * 10^308$ ~ $1.7 * 10^308$ 까지 표현할 수 있다.
e2
: 이러한 표현은 10의 제곱($10^2$) 을 의미한다.
3. 8진수와 16진수
익히 아는 그것
4. 증감연산(++, --)
익히 아는 그것
02 - 불
불연산
각종 연산의 결과값이 불 자료형에 대입이 될 수 있다.
boolean a1 = (2 > 1) // 참
boolean a2 = (1 == 2) // 거짓
boolean a3 = (3 % 2 == 1) // 참 (3을 2로 나눈 나머지는 1이므로 참이다.)
boolean a4 = ()"3".equals("2")) // 거짓
조건문
익히 아는 그것
03 - 문자
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 출력
04 - 문자열
자바의 문자열의 자료형은 String 이다.
리터럴 표기 법에 따라 변수에 대한 차이가 존재 한다.
💡 리터럴 표기
String a = "happy java" 와 String a = new String("happy java")는 같은 값을 갖지만 완전히 동일하지는 않다. 첫번째 방식을 리터럴(literal) 표기라고 하는데 객체 생성없이 고정된 값을 그대로 대입하는 방법을 말한다. 위 예에서 리터럴 표기법은 "happy java" 라는 문자열을 intern pool 이라는 곳에 저장하고 다음에 다시 동일한 문자열이 선언될때는 cache 된 문자열을 리턴한다. 두번째 방식은 항상 새로운 String 객체를 만든다.
원시(primitive) 자료형
고전적인 자료형을 통해 선언된 변수들, 이러한 자료형을
원시 자료형
이라고 부른다. 더불어new
키워드를 통한 값 생성이 불가능하다.여기서 String 자료형은 리터럴로 표현도 되지만
new
키워드 사용 생성도 가능하다.
원시 자료형의 Wrapper 클래스
값 대신 객체형으로 만들어 값을 저장하고 부가적인 작업을 위한 클래스 형이다.

문자열 내장 메소드
1. equals
String a = "hello";
String b = "java";
String c = "hello";
System.out.println(a.equals(b)); // false 출력
System.out.println(a.equals(c)); // true 출력
// '==' 는 사용할 수 없다.
String a = "hello"; String b = new String("hello"); System.out.println(a.equals(b)); // true
System.out.println(a == b); // false
2. indexOf
특정 문자의 시작 위치(인덱스)를 리턴한다.
String a = "Hello Java";
System.out.println(a.indexOf("Java")); // 6 출력
3. contains
문자열에서 특정 문자열이 포함되어 있는지 여부를 리턴한다.
String a = "Hello Java";
System.out.println(a.contains("Java")); // true를 출력함
4. charAt
문자열 내부에 특정 문자 위치를 반환한다.
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
문자열 중 특정 부분만을 뽑아낼 경우 사용한다.
String a = "Hello Java";
System.out.println(a.substring(0, 4)); // "Hell" 출력
7. toUpperCase
문자열을 모두 대문자로 변경 시, 반대는 toLowerCase 메소드를 사용
String a = "Hello Java";
System.out.println(a.toUpperCase()); // "HELLO JAVA"를 출력함
8. split
특정 문자 구분자로 문자열을 분리하는 메소드
String a = "a:b:c:d";
String[] result = a.slit(":"); // result = {"a", "b", "c", "d"}
문자열 포매팅
어떤 문자열을 출력한다고 할 때, 문자열 안의 특정 값을 바꾸는 경우가 문자열 포매팅 기법이라고 한다.
문자열 포매팅 따라 하기
숫자 바로 대입
System.out.println(String.format("I eat %d apples.", 3)); // "I eat 3 apples." 출력
문자열 바로 대입
System.out.println(String.format("I eat %s apples.", "five")); // "I eat five apples." 출력
숫자 값을 나타내는 변수로 대입
int number = 3; System.out.println(String.format("I eat %d apples.", number)); // "I eat 3 apples." 출력
2개 이상의 값 넣기
int number = 10; String day = "three"; // "I ate 10 apples. so I was sick for three days." 출력 System.out.println(String.format("I ate %d apples. so I was sick for %s days.", number, day));
문자열 포맷 코드
문자열 포매팅 예제에서는 대입해 넣는 자료형으로 정수와 문자열 했으나 이 외에도 다양한 것을 대입 가능.

%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" 출력
%d와 %를 같이 쓸 때는 %%를 써줘야 한다.
System.out.println(String.format("Error is %d%%.", 98)); // "Error is 98%." 출력
포맷 코드와 숫자 함께 사용하기
정렬과 공백
System.out.println(String.format("%10s", "hi")); // " hi" 출력 // 왼쪽 정렬은 $-10s 가 될 것이다. System.out.println(String.format("%-10sjane.", "hi")); // "hi jane. " 출력
소수점 표현하기
System.out.println(String.format("%.4f", 3.42134234)); // 3.4213 출력 System.out.println(String.format("%10.4f", 3.42134234)); // ' 3.4213' 출력
System.out.printf()
System.out.println(String.format("I eat %d apples.", 3)); // "I eat 3 apples." 출력 System.out.printf("I eat %d apples.", 3); // "I eat 3 apples." 출력
05 - StringBuffer
StringBuffer 는 문자열을 추가하거나 변경할 때 사용하는 자료형.
append
StringBuffer sb = new StringBuffer(); // StringBuffer 객체 sb 생성
sb.append("hello");
sb.append(" ");
sb.append("jump to java");
String result = sb.toString();
System.out.println(result);
이어붙이기 및 toString() 메소드를 활용해 String 자료형으로 변경이 가능하다.
## 결과
hello jump to java
String result = "";
result += "hello";
result += " ";
result += "jump to java";
System.out.println(result);
예시 중 아래 예시는 String 자료형을 활용한 방식이다.
둘은 동일한 결과물을 가지지만 내부적으로 객체의 생성과 메모리 사용 과정은 다르다.
첫번째 예제 : 객체가 한번만 생성됨
두번째 예제 :
+
연산이 있을 때마다 새로운 객체 String을 생성한다. 즉, 총 4개의 객체가 생성이 이어진다.
String 자료형은 한번 값이 생성하면 값이 변경되지 못하고, 이러한 성격을
immutable
라고 한다.당연히 하위 메소드들에서도 그러한 특성이 그대로 적용되 새로운 객체를 생성하게 된다.
따라서 StringBuffer 는
mutable
한 특성을 가질 수 있다.그러나 무조건 StringBuffer를 사용하는 것이 좋은 것은 아니다. 해당 자료형이 무거운 편이라는 점, 속도 느리다는 점이 존재한다. 따라서 상황에 맞춰 일반 String 자료형 사용도 좋다고 판단된다.
✅ StringBuilder
StringBuffer와 비슷한 자료형이며, 사용법은 동일. StringBuffer는 멀티 스레드 환경에서 안전하다는 장점이 있고, StringBuilder는 성능이 우수하다는 장점이 있어, 동기화를 고려할 필요가 없는 상황에선 StringBuilder 를 사용하는 것이 유리하다.
StringBuilder sb = new StringBuilder();
sb.append("hello"); sb.append(" ");
sb.append("jump to java");
String result = sb.toString();
System.out.println(result);
insert
특정 위치에 원하는 문자열을 삽입할 수 있다.
StringBuffer sb = new StringBuffer();
sb.append("jump to java");
sb.insert(0, "hello ");
System.out.println(sb.toString());
hello jump to java
substring
String의 그것과 동일하게 사용 된다.
StringBuffer sb = new StringBuffer(); sb.append("Hello jump to java"); System.out.println(sb.substring(0, 4));
Hell
06 - 배열
배열이란 자료형의 종류가 아닌 자료형의 집합을 의미한다.
배열의 길이는 고정되어 있다
String[] weeks = new String[7];
weeks[0] = "월";
weeks[1] = "화";
weeks[2] = "수";
weeks[3] = "목";
weeks[4] = "금";
weeks[5] = "토";
weeks[6] = "일";
// 가변형 길이란 있을 수 없다.
배열의 값은 어떻게 접근할 수 있을까
아는 그대로
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}; System.out.println(weeks[3]);
배열의 길이
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
for (int i=0; i<weeks.length; i++) { // length 메소드를 활용하면, 쉽게 구할 수 있다.
System.out.println(weeks[i]);
}
빈번한 배열의 오류
배열과 관련된 오류는 보통 배열의 범위를 초과하는 오류다. (
ArrayIndexOutOfBoundsException
)
07 - 리스트
배열과 유사하지만 자바의 자료형으로 배열보다 편리한 기능을 많이 가지고 있다.
핵심은 크기가 고정되지 않고 동적으로 변한다는 점
ArrayList
List 자료형 중 가장 간단한 형태인 자료형
💡 List 자료형
List 자료형에는 ArrayList, Vector, LinkedList 등의 다료형이 존재한다.
add
import java.util.ArrayList; // #include 와 유사한 기능
public class Sample {
public static void main(String[] args) {
ArrayList pitches = new ArrayList();
pitches.add("138"); pitches.add("129");
pitches.add("142");
}
}
get
System.out.println(pitches.get(1));
ArrayList 의 특정 인덱스의 값을 추출할 수 있다.
size
System.out.println(pitches.size());
contains
리스트 안에 해당 항목이 있는지를 판별하여 그 결과를 boolean 으로 리턴한다.
System.out.println(pitches.contains("142"));
remove
두가지 방식으로 사용이 가능하다(이름은 같지만 매개변수가 다르다)
remove(객체) : 이 방식의 경우 해당 항목 삭제 후 결과를 리턴한다.
remove(인덱스) : 이 방식의 경우 해당 항목 삭제 후 삭제 항목을 리턴한다(pop)
// 객체
System.out.println(pitches.remove("129"));
// 인덱스
System.out.println(pitches.remove(0));
제네릭스(Generics)
J2SE 5.0 이후 도입된 개념.
ArrayList<String> pitches = new ArrayList<String>();
ArrayList<String> pitches = new ArrayList<>(); // 선호되는 방식
ArrayList pitches = new ArrayList(); // J2SE 1.4까지 방식
제네릭스 표현식은 ArrayList아네 담을 수 있느 자료형은 String 타입뿐이다.라고 예시에서 알려주고 있다.
해당 표현식을 이용하면 좀더 명확한 타입 체크가 가능해진다.
// 제네릭스를 사용하지 않은 경우
ArrayList pitches = new ArrayList();
pitches.add("138");
pitches.add("129");
String one = (String) pitches.get(0);
String two = (String) pitches.get(1);
위의 예시 처럼 제네릭스가 없을 경우 안에 추가된 객체는 모두 Object 자료형으로 인식된다.
ArrayList 객체인 pintches에 값을 넣는 것은 별 문제가 없지만, 값을 가져와 다른 변수에 넣는다면 형변환이 반드시 필요해진다.
// 제네릭스를 사용하는 경우
ArrayList<String> pitches = new ArrayList<>();
pitches.add("138");
pitches.add("129");
String one = pitches.get(0); // 형 변환이 필요없다.
String two = pitches.get(1); // 형 변환이 필요없다.
다양한 방법으로 ArrayList 만들기
ArrayList 의 add 메소드를 사용하면 객체에 요소를 추가할 수 있다.
import java.utill.ArrayList;
public class Sample {
public static void main(String[] args){
ArrayList<String> pitches = new ArrayList<>(); // 제네릭스 활용
pitches.add(138);
pitches.add(129);
pitches.add(142);
System.out.println(pitches); // [138, 129, 142]출력
}
}
만약 데이터가 이미 존재하는 경우 ArrayList를 좀더 빠르게 생성도 가능하다.
import java.utill.ArrayList;
import java.util.Arrays
public class Sample {
public static void main(String[] args){
String[] data = {"138", "129", "142"};
ArrayList<String> pitches = new ArrayList<>(Arrays.asList(data)); // 제네릭스 활용
System.out.println(pitches); // [138, 129, 142]출력
}
}
String 자료형을 여러개 전달하여 생성도 가능하다.
import java.utill.ArrayList;
import java.util.Arrays
public class Sample {
public static void main(String[] args){
ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142")); // 제네릭스 활용
System.out.println(pitches); // [138, 129, 142]출력
}
}
String.join
위에서 만든 ArrayList 의 각 요소를 콤마로 구분하여 하나의 문자열로 합치기도 가능하다.
import java.util.ArrayList;
import java.util.Arrays;
public class Sample {
public static void main(String[] args) {
ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142"));
String result = "";
for (int i = 0; i < pitches.size(); i++) {
result += pitces.get(i);
result += ", ";
}
result = result.substring(0, result.length() - 2);
System.out.println(result);
}
}
오버라이딩된 개념으로 해당 메소드는 리스트의 각 요소에 구분자를 삽입한 하나의 문자열 생성도 가능하다.
public class Sample {
public static void main(String [] args) {
String[] pitches = new String[]{"138", "1249", "142"};
String result = String.join(",", pitches);
System.out.println(result);
System.out.println(pitches[0]);
}
}
⛔️ 주의
String.join 메소드는 Java 8 버전부터 사용할 수 있다.
리스트 정렬하기
리스트를 정렬하는 경우 sort 메소드를 활용한다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator; // sort 를 위한 라이브러리
public class Sample {
public static void main(String[] args) {
ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142"));
pitches.sort(Comparator.naturalOrder()); // 오름차순으로 정렬
//reverseOrder() 를 사용하면 내림차순 정리가 가능하다.
System.out.println(pitches); // 129, 138, 142 출력
}
}
⛔️ 주의
sort 메소드는 Java 8 버전부터 사용할 수 있다.
08 - 맵(Map)
특정한 대상에 대해서는 여러가지 속성이 존재하고 이러한 속성의 값이 존재한다. 이를 담기 쉽도록 구현된것이 맵이다.
최신의 언어들이 대부분 갖고 있는 자료형으로 Associative array, Hash 라고도 불릴 수 있다.
맵은 사전(dictionary)와 비슷하다. 키와 값(key and value) 한쌍으로 갖는 자료형이다./
특징적으로 리스트나 배열처럼 순차적인 값 구하기는 불가능. 하지만 key를 통해 value 를 얻는다.
HashMap
✅ Map의 특징
Map 역시 List 와 마찬가지로 인터페이스이며, Map 자료형에는 HashMap, LinkedHashMap, TreeMap 등이 있다. 인터페이스에 대해서는 객체지향 챕터를 참고할 것. Map 자체가 인스턴스화 시킬 순 없고, 최상단 부모로써 Map 클래스를 선언 및 활용만 가능하다.
put
key 와 value 가 String 형태인 HashMap을 만들며, 작성하면 다음같은 예시를 구현할 수 있다.
import java.util.HashMap;
public class Sample {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("people", "사람");
map.put("baseball", "야구");
}
}
get
key 를 통해 해당하는 값의 value 를 얻는 것은 다음처럼 하여 사용이 가능하다.
import java.util.HashMap;
public class Sample {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("people", "사람");
map.put("baseball", "야구");
System.out.println(map.get("people"));
}
}
getOrDefault
맵의 key에 해당하는 value가 없을 경우에 get 메소드를 사용하면 다음처럼 null이 리턴된다.
System.out.println(map.get("java")); // null 출력
이때 null 대신 디폴트 값을 얻고 싶은 경우에는 getOrDefault 메소드를 사용한다.
System.out.println(map.getOrDefault("java", "자바")); // "자바" 출력
containsKey
Map 안에 키가 존재하는지를 확인하고 이를 리턴한다. (boolean 타입)
import java.util.HashMap;
public class Sample {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("people", "사람");
map.put("baseball", "야구");
if (map.containsKey("baseball")) { // true
System.out.print(map.get("baseball"));
System.out.println("가(이) 존재합니다.");
}
String check = "야구"; // fail
if (map.containsKey(check)) {
System.out.print(check);
System.out.println("가(이) 존재합니다.");
}
else{
System.out.print(check);
System.out.println("가(이) 존재하지 않습니다."); // 존재하지 않음이 뜸
}
}
}
remove
이 메소드는 Map의 키값으로 요소를 찾은 뒤 그 값을 리턴한다.
System.out.println(map.remove("people")); // "사람" 출력
size
Map 의 개수를 리턴하는 메소드다.
System.out.println(map.size()); // 1 출력
keySet
해당 인스턴스의 key 값을 전체 출력해준다.
import java.util.HashMap;
public class Sample {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("people", "사람");
map.put("baseball", "야구");
System.out.println(map.keySet());
}
}
여기서 특징은
keySet()
메소드는 Map 의 key를 모아서Set
자료형으로 리턴한다. 또한 여기서List
자료형으로 바꾸어 사용도 가능하다.
List<String> keyList = new ArrayList<>(map.keySet());
LinkedHashMap과 TreeMap
Map의 가장 큰 특징은 순서에 의존하지 않고 key로 value를 가져오는데 있다. 하지만 가끔은 Map에 입력된 순서대로 데이터를 가져오고 싶은 경우도 있고 때로는 입력된 key에 의해 소트된 데이터를 가져오고 싶을 수도 있을 것이다. 이런경우에는 LinkedHashMap과 TreeMap을 사용하는 것이 유리하다.
LinkedHashMap은 입력된
순서대로 데이터를 저장
하는 특징을 가지고 있다.TreeMap은 입력된 key의 오름차순 순서로 데이터를 저장하는 특징을 가지고 있다.
09 - 집합(Set)
집합과 관련된 내용을 처리하기 쉽게 만든 자료형이다.
집합 자료형은 어떻게 만들까
HashSet 을 사용하여 만들 수 있다.
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public staic void main(String[] args) {
HashSet<String> set = new HashSet<>(Arrays.asList("H", "e", "l", "l", "o"));
System.out.println(set);
}
}
[e, H, l, o]
집합 자료형의 특징
출력 결과가 이상하다. 집어 넣은 데로 나오는 것이 아니며, 순서도 다르다. 여기에는 집합 자료형이 가지는 2가지 특징이 존재하기 때문이다.
중복을 허용하지 않는다.
순서가 없다(Unordered).
리스트나 배열은 순서성을 가지고 있어, 인덱싱을 통해 자료형의 값을 얻을 수 있다. 그러나 집합은 그러한 특성이 없어 인덱싱이 불가능하고, 이는 맵과 유사하다.
따라서 중복을 허용하지 않는 집합의 자료형의 특징이 필요한 필터 역할로 종종 사용되곤 한다.
교집합, 합집합, 차집합 구하기
집합 자료형의 특성을 생각할 때 가장 유용한 기능은 집합의 개념인 교집합, 합집합, 차집합이다.
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));
}
}
// 제네릭스로 int를 사용하고 싶은 경우 int의 Wrapper 클래스인 integer 를 대신 사용해야 한다.
1. 교집합
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));
HashSet<Integer> intersection = new HashSet<>(s1); //s1을 기준으로 교집합 공간을 생성
intersection.retainAll(s2); // 교집합 수행
System.out.println(intersection); // [4, 5, 6]
}
}
2. 합집합
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));
HashSet<Integer> union = new HashSet<>(s1);
union.addAll(s2); // 합집합 수행
System.out.println(union);
}
}
3. 차집합
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));
HashSet<Integer> substract = new HashSet<>(s1);
substract.removeAll(s2);
System.out.println(substract);
}
}
집합 자료형 관련 메소드
값 추가하기(add)
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("jump");
set.add("to");
set.add("java");
System.out.println(set);
}
}
값 여러 개 추가하기(addAll)
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("jump");
set.addAll(Array.asList("to", "java")); // 합집합 연산에서 사용한 것을 그대로 활용하자.
System.out.println(set);
}
}
특정 값 제거하기
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>(Arrays.asList("jump", "to", "java"));
set.remove("to");
System.out.println(set);
}
}
💡 참고하세요 : TreeSet과 LinkedHashSet
Set 자료형은 기본적으로 순서가 존재하지 않으나, 가끔은 입력된 순서대로 데이터를 가져오고 싶을 수 있고, 오름차순으로 정렬된 데이터를 가져오고 싶을 수 있다. 이럴 때 사용하면 된다. - TreeSet - 오름차순으로 값을 정렬하는 특징이 있다. - LinkedHashSet - 입력한 순서대로 값을 정렬하는 특징이 있다.
10 - 상수집합(Enum)
서로 관련이 있는 여러개의 상수 집합을 정의할 때 사용한다.
Enum 만들기
public class Sample {
enum CoffeeType {
AMERICANO,
ICED_AMERICANO,
CAFE_LATTE
};
public static void main(String[] args) {
System.out.println(CoffeeType.0);
System.out.println(CoffeeType.1);
System.out.println(CoffeeType.2);
//반복문 사용
for (CoffeeType type: CoffeeType.values()) {
System.out.println(type);
}
}
}
Enum은 왜 필요한가?
매직넘버를 사용할 때보다 코드를 명확하게 만들 수 있다.
잘못된 값을 사용하여 발생할 위험을 줄 일 수 있다.
매직넘버 : 프로그래밍 상에서 상수로 선언하지 않은 숫자를 매직넘버
11 - 형변환과 final
형변환
public class Sample {
public static void main(String[] args) {
// 정수형 변환
String num = "123";
int n = Integer.parseInt(num);
System.out.println(num);
// 문자열 형변환(1)
int n2 = 123;
String num2 = "" + n;
// 문자열 형변환(2)
String num3 = String.valueOf(n2);
String num4 = Integer.toString(n);
System.out.println(num3);
System.out.println(num4);
// 실수형 변환
String num5 = "123.456";
double d = Double.parseDouble(num5);
System.out.println(d);
// 정수 실수 간의 형변환
int n3 = 123;
double d2 = 123.456;
double d1 = n1; // 정수 -> 실수 캐스팅 불필요
int n4 = (int) d2; // 실수 -> 정수 반드시 명시적 캐스팅 필요
System.out.println(d1);
System.out.println(n4);
// 실수 형태의 문자열을 정수로 변경하려고 하면 NumberFormatException 이 발생한다.
//String num = "123.456";
//int n = Integer.parseInt(num); // 에러 발생
}
}
final
자료형의 값을 단 한번만 설정하도록 강제한다. 즉, 값을 한번 설정하면 다시 재설정이 불가능하다.
public class Sample {
public static void main(String[] args) {
final int n = 123;
n = 456; // 컴파일 에러 발생
final ArrayList<string> a = new ArrayList<>(Arrays.asList("a", "b"));
a = new ArrayList<>(Arrays.asList("c", "d")); // 컴파일 에러 발생
}
}
✅ Unmodifiable List
리스트의 경우 final 선언시 리스트에 값을 더하거나 빼는 것은 가능하다. 다만 "재할당"이 불가능할 뿐이다. 만약 그 값을 더하거나 빼는것도 불가능하게 하는 걸 원하면 List.of로 수정 불가 리스트를 생성해야 한다.
import java.util.List;
public class Sample {
public static void main(String[] args) {
final List<String> a = List.of("a", "b");
try {
a.add("c"); // UnsupportedOPerationException 발생
} catch(UnsupportedOperationException e){
System.out.println("Exception happens.");
}
}
}
연습문제
Last updated