-
[java] 자료형과 형변환java 2023. 1. 12. 23:35
3-1 숫자 자료형
정수
자바의 정수를 표현하기 위한 자료형은 int , long
int age = 10; long countOfStar = 87984751321246845L; /*long변수에 값을 대입할때는 숫자 값이 int자료형의 최대값인 2147483647보다 큰 경우 접미사 L을 붙여주어야한다.*/실수
자바의 실수를 표현하기 위한 자료형은 float,double
float pi = 3.14F; //접미사F를 꼭 붙여주어야한다. double morePi = 3.123456123; double d1 = 1.234e2; // e2는 10의 제곱을 의미함8진수와 16진수
8진수와 16진수는 int자료형을 사용하여 표시한다.
0으로 시작하면 8진수, 0x로 시작하면 16진수가된다.
증감 연산
자바는 ++ , --기호를 통해 값을 증가하거나 감소시킬 수 있다., 그러나 연산자의 위치에 따라 결과값이 달라진다.
증감연산자가 i++와 같이 변수 뒤에 붙는 경우 : 해당 코드를 사용하는 문장이 실행된 이후에 i값이 증가한다.
증감연산자가 ++i와 같이 변수 앞에 붙는 경우 : i가 먼저 증가한 후에 해당코드가 실행된다.
3-2 boolean
true 혹은 false값을 갖는 자료형을 boolean이라고 한다.
불 연산은 보통 조건문 판단 기준으로 많이 사용됨.
3-3 문자 (char)
문자 한 개의 값에 대한 자료형은 char.
char a1 = 'a'; //문자로 표현 char a2 = 97; //아스키코드로 표현 char a3 = '\u0061'; 유니코드로 표현 //char는 문자값을 표현하는 방식이 다양하다. 세가지 모두 a라는 문자를 출력한다.3-4 문자열 (String)
문자열이란 문자들로 구성된 문장을 뜻한다. 자료형은 String
//리터럴 표기법 String a = "Happy java"; String b = "a"; //혹은 다음과 같이 새로운 객체를 만드는 형식으로 사용할 수도 있다. new키워드는 객체를 만들 때 사용한다. String a = new String("Happy Java");리터럴 표기법 : 객체생성없이 고정된 값을 그대로 대입하는 방법으로, 문자열을 JVM의 interm pool이라는 메모리 공간에 저장하고 다음에 다시 동일한 문자열이 선언될 때는 cashe된 문자열을 리턴한다. 보통 문자열을 표기할 때는 리터럴표기법을 이용하는 것이 좋다.
원시(primitive)자료형
int, long, double, float, boolean, char자료형은 primitive자료형이라고 부른다.
privitive자료형은 new키워드로 값을 생성할 수 없다. 항상 리터럴로만 값을 세팅할 수 있다.
원시 자료형의 Wrapper Class
원시자료형 Wrapper Class int Integer long Long double Double float Float boolean Boolean char Char 앞으로 공부할 ArrayList, HashMap, HashSet 등은 데이터를 생성할 때 primitive자료형 대신 그에 대응하는 Wrapper Class를 사용해야한다. primitive 자료형 대신 Wrapper Class를 사용하면 값 대신 객체를 주고 받을 수 있어 코드를 객체 중심적으로 작성하는데 유리하다. 멀티스레딩환경에서 동기화를 지원하기 위해서도 반드시 필요함.
문자열 내장 메소드
String 자료형의 내장 메소드 중에서 자주 사용하는 것에 대해 알아보자
equals
equals는 두 개의 문자열이 동일한지 비교하여 결과값을 리턴한다.
문자열의 값을 비교할때는 반드시 equls() method를 사용해야 한다.
==연산자는 두 개의 자료형이 동일한 객체인지를 판별하기 때문에 객체가 다를 경우 같은 문자열값을 갖고있더라도 false가 리턴될 수 있다.
String a = "hello"; String b = new String("hello"); //a와 b는 서로다른 객체이다. System.out.println(a.equals(b)); // true System.out.println(a == b); // falseindexOf
indexOf은 문자열에서 특정 문자열이 시작되는 위치(인덱스)를 가르킨다.
String a = "Hello Java"; System.out.println(a.indexOf("Java"); // 6출력contains
contains는 문자열에서 특정 문자열이 포함되어 있는지 여부를 boolean으로 리턴
String a = "Hello Java"; System.out.println(a.contains("Java"); // true출력charAt
charAt는 문자열에서 특정 위치의 문자(char)를 리턴
String a = "Hello Java"; System.out.println(a.charAt(6); // J 출력replaceAll
replaceAll은 문자열 중 특정 문자열을 다른 문자열로 바꾸고자 할 때 사용
String a = "Hello Java"; System.out.println(a.replaceAll("Java","World"); // Hello World 출력substring
substring(시작위치, 끝위치) -> 시작위치 <= a < 끝위치 범위내에 부분을 뽑아낸다.
String a = "Hello Java"; System.out.println(a.substring(0,4)); // Hell 출력.toUpperCase() / .toLowerCase()
문자열을 모두 대문자 혹은 소문자 로 변경함
split
문자열을 특정 구분자로 나누어 문자열 배열로 리턴한다.
String a = "a:b:c:d"; String[] result = a.split(":"); // result = {"a","b","c","d"}문자열 포매팅
문자열 안의 특정한 값을 바꿔야하는 경우 사용한다. 문자열 포매팅은 String.format메소드를 이용한다.
System.out.println(String.format("I eat %d apples.", 3)); //숫자 대입 System.out.println(String.format("I eat %s apples.","five")); //문자열 대입 System.out.println(String.format("I eat %s apples.",5)); //%s는 어떤형이 오더라도 문자열로 바꿈 int number =3; System.out.println(String.format("I eat %d apples.", number)); // int형 변수로 대입 String day ="three"; System.out.println(String.format("I ate %d apples. so I was sic for $s days.", number,day)); //두개 이상의 값 넣기 <출력결과> I eat 3 apples . I eat five apples. I eat 5 apples. I eat 3 apples. I ate 3 apples. so I was sic for three days.문자열 포맷 코드
코드 설명 %s 문자열(String) %c 문자 1개 (char) %d 정수 (Integer) %f 부동소수 (floating-point) %o 8진수 %x 16진수 %% Literal%(문자%자체) [포매팅 연산자 %d와 %(기호)를 같이 쓸 때는 %%라고 표기해야한다] System.out.println(String.format("Error is %d%%.",98)); // Error is 98%포맷 코드와 숫자 함께 사용하는 경우
1. 정렬과 공백 System.out.println(String.format("%10s", "hi")); //"________hi"출력 // 전체 길이가 10인 문자열 공간에서 대입되는 값은 오른쪽 정렬하고 그앞 나머지는 공백으로 둔다. System.out.println(String.format("%-10sjane", "hi")); //"hi________jane"출력 // 전체 길이가 10인 문자열 공간에서 대입되는 값은 왼쪽 정렬하고 그뒤 나머지는 공백으로 둔다. 2. 소수점 표현하기 System.out.println(String.foramt("%4.f",3.42134234)) // 3.4213출력 // 소수점 네번째 자리까지만 나타냄 System.out.println(String.format("10.4f",3.42134234)) // ____3.4213 출력System.out.printf
String.format 메소드는 포매팅된 문자열을 리턴한다.
System.out.println 메소드는 포매팅한 문자열을 출력한다.
System.out.printf 메소드는 문자열을 출력하는 메소드이다. (String.format 메소드 없이도 포메팅된 문자열 추출가능)
ex) System.out.printf("I eat %d apples",3);
3-5 String Buffer자료형
String Buffer 와 String의 차이
String Buffer는 문자열을 추가하거나 변경할때 주로 사용하는 자료형으로, 객체 생성 한번으로 값을 자유롭게 변경할수있다. (mutable) /문자열 변경 작업이 많은 경우 사용
String자료형은 + 연산이 있을떄마다 새로운 객체를 생성한다 즉, 한번 값이 생성되면 그 값을 변경할 수가 없다.(immutable)
/문자열 변경 작업이 거의 없는 경우사용
append() : 문자열 추가하는 메소드
toString() : String자료형으로 변경하는 메소드
insert (): 특정 위치에 원하는 문자열을 삽입
substring() : 시작위치 <= <끝위치 사이 문자를 뽑아낸다.
public class HelloWorld { public static void main(String[] args){ StringBuffer sb = new StringBuffer(); sb.append("hello"); sb.append(" "); sb.append("jump to java"); sb.insert(0, "hello"); String result = sb.toString(); System.out.println(result); System.out.println(sb.substring(0, 4)); String sb2 = ""; sb2 += "hello"; sb2 += " "; sb2 += "jump to java"; System.out.println(sb2); } } <출력 결과> hellohello jump to java hell hello jump to java3-6 배열(Array)
- 배열이란 자료형의 종류가 아닌 자료형의 집합을 의미한다.
- 배열을 자료형 타입 바로 옆에 [] 기호를 사용해 표현한다.
int[] odds = {1,3,5,7,9};배열의 특징
1. 배열의 길이는 고정되어 있다.
초기값 없이 배열 변수를 만들때는 반드시 길이에 대한 정보가 필요하다.
String[] weeks = {"월","화","수"} // 가능 String[] weeks = new String[3] // 가능 weeks[0] = "월"; Stirng[] weeks = new String[] //불가능2. 배열 값 접근법
배열 내부 값에 접근하기 위해서는 인덱싱을 해야한다.
3. 배열의 길이
주로 반복문에서 자주 활용되며, length를 이용한다.
public class HelloWorld { public static void main(String[] args){ String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}; for (int i = 0; i < weeks.length; i++) { System.out.println(weeks[i]); } } }3-7 List
리스트와 배열의 차이
배열은 크기가 정해져 있지만 리스트는 크기가 정해져있지 않고 동적으로 변하는 특징을 가지고 있다.
ArrayList
List의 자료형은 인터페이스인데 그 중 간단한 자료형이다.
ArrayList를 사용하기 위해서는 import java.util.ArrayList를 임포트 해주어야한다.add : 값을 추가
get : 해당 인덱스 위치에 값을 가져옴
size : ArrayList의 갯수를 리턴함
contains : 리스트 안에 해당 항목이 있는지 판별해 boolean으로 리턴함
remove : 값을 삭제함
- remove(객체) : 리스트에서 객체에 해당하는 항목 삭제 후 삭제한 결과를 boolean으로 리턴함
- remove(인덱스) : 해당 인덱스의 항목을 삭제하고 삭제된 항목을 리턴함
import java.util.ArrayList; public class HelloWorld { public static void main(String[] args){ ArrayList<Sring> pitches = new ArrayList<>(); pitches.add("138"); pitches.add("129"); pitches.add(0,"130"); // pithes[0]에 130을 넣겠다는의미 System.out.println(pitches.get(1)); //138 System.out.println(pitches.size()); //3 System.out.println(pitches.contains("1432")); //false System.out.println(pitches.remove("129")); // true System.out.println(pitches.remove(0)); // 130 } }제네릭스
ArrayList안에 담을 수 있는 자료형은 String뿐임을 나타내주는 구문이다.
ArrayList<String> pitches = new ArrayList<>();
제네릭스를 사용하지 않을 경우, ArrayList안에 추가되는 객체는 Object자료형으로 인식되어 값을 가져올떄 형변환(casting)과정을 거쳐야 되는데 이떄 잘못된 형변환으로 오류가 발생할 가능성이 높다. so, 제네릭스를 이용해야 명확한 타입체크가 가능하고 불필요한 casting과정을 거치지 않아도 된다.
asList()메소드 :
- 문자열 배열이 존재하는 경우 이를 이용해 ArrayList를 생성할 수 있다.
- 혹은 String배열 대신 String 자료형을 여러개 전달할 수도있다.
import java.util.ArrayList; import java.util.Arrays; public class HelloWorld { public static void main(String[] args){ String[] data = {"138", "129", "142"}; ArrayList<String> pitches = new ArrayList<>(Arrays.asList(data)); //1경우 System.out.println(pitches); ArrayList<String> pitches2 = new ArrayList<>(Arrays.asList("138", "129", "142"));//2경우 System.out.println(pitches2); } }String.join()메소드 :
ArrayList의 각 요소들을 구분하여 하나의 문자열로 만들 수 있다.
// String.join을 쓰지 않고 구현 import java.util.ArrayList; import java.util.Arrays; public class HelloWorld { 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 += pitches.get(i); result +=","; } result = result.substring(0, result.length() - 1); System.out.println(result); } }//String.join이용하여 구현 import java.util.ArrayList; import java.util.Arrays; public class HelloWorld { public static void main(String[] args){ ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142")); String reuslt = String.join(",", pitches); System.out.println(reuslt); } }sort()메소드 : 리스트 정렬하기
sort메소드에서는 정렬 기준을 파라미터로 전달해주어야한다.
- 오름차순 정렬 - Comparator.naturalOrder();
- 내림차순 정렬 - Comparator.reverseOrder();
import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; public class HelloWorld { public static void main(String[] args){ ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142")); pitches.sort(Comparator.naturalOrder()); System.out.println(pitches); } }3-8 Map
key와 value를 한쌍으로 갖는 자료형이다. Associative array, Hash라고 불린다.
대응관계를 쉽게 표현할 수 있게 해준다.
key value people 사람 HashMap
Map역시 List와 마찬가지로 인터페이스이다. Map인터페이스를 구현한 Map자료형에는 HashMap,LinkedHashMap,TreeMap등이 있다.
Map의 가장 큰 특징은 순서에 의존하지 않는다는 점인데 만약 순서대로 데이터를 가져오고 싶은경우
LinkedHashMap or TreeMap을 이용한다.put : 값을 추가
get : key에 해당하는 value값을 얻을 수 있다.
getOrDefault : get을 사용할때 key에 해당하는value가 없는 경우 null이 리턴되는데 이때 이 null대신 원하는 디폴트값으로 출력해준다.
containsKey : 맵에 해당 키가 있는지를 조사하여 boolean으로 리턴한다.
remove : key에 해당되는 value값을 삭제하고 그 값을 리턴한다.
size : Map의 갯수를 리턴한다.
import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; public class HelloWorld { public static void main(String[] args){ HashMap<String, String> map = new HashMap<>(); map.put("people", "사람"); map.put("baseball", "야구"); System.out.println(map.get("people")); System.out.println(map.getOrDefault("java","자바")); System.out.println(map.containsKey(("people"))); System.out.println(map.remove("people")); System.out.println(map.size()); } }keySet : 맵의 모든 key를모아서 Set 자료형으로 리턴한다.
import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; public class HelloWorld { public static void main(String[] args){ HashMap<String, String> map = new HashMap<>(); map.put("people", "사람"); map.put("baseball", "야구"); System.out.println(map.keySet()); } } [baseball, people]Set 자료형은 다음과 같이 List자료형으로 바꾸어 사용할 수도있다.
List<String> keyLIst = new ArrayList<>(map.keySet());3-9 집합 (Set)
Set자료형에는 HashSet, TreeSet, LinkedSet등의 Set인터페이스를 구현한 자료형이 있다.
import java.util.*; public class HelloWorld { public static void main(String[] args){ HashSet<String> set = new HashSet<>(Arrays.asList("H", "e", "l", "l", "o")); System.out.println(set); } } <출력결과> [e, H, l, o]집합자료형의 특징
1. 집합 자료형과 맵자료형은 순서가 있는 리스트나 배열과 달리 순서가 없다. 순서가없으므로 인덱싱을 할 수 없다.
2. 중복을 허용하지 않는다.
교집합, 합집합, 차집합 구하기
교집합 : retainAll()
합집합 : addAll()
차집합 : removeAll()
import java.util.*; public class HelloWorld { 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)); /*s1데이터를 유지하기 위해 intersection 이라는 HashSet객체를 copy하여 생성하였다. 만약 intersection대신 s1에 retainAll 메소드를 사용하면 s1의 내용이 변경된다. */ HashSet<Integer> intersection = new HashSet<>(s1); intersection.retainAll(s2); //차집합 합집합의 경우 메소드만 맞게 바꿔주면됨 System.out.println(intersection); } }집합 자료형 관련 메소드
add() : 집합 자료형에 값 추가
addAll() : 여러개의 값을 한꺼번에 추가
remove() : 특정 값 제거하기
import java.util.*; public class HelloWorld { public static void main(String[] args){ HashSet<String> set = new HashSet<>(); set.add("Jump"); set.addAll(Arrays.asList("To", "Java")); System.out.println(set); set.remove("To"); System.out.println(set); } } [Java, To, Jump] [Java, Jump]3-10 상수집합(Enum)
Enum은 서로 관련이 있는 여러 개의 상수집합을 정의할 때 사용하는 자료형이다.
만약 어떤 커피숍에서 판매하는 커피의 종류가 다음이라고 가정해보자.
- 아메리카노
- 아이스 아메리카노
- 카페라떼
이와 같이 3종류의 커피를 판매한다고 하면 다음과 같이 Enum으로 상수집합을 만들 수 있다.
enum CoffeType{ AMERICANO, ICE_AMERICANO, CAFE_LATTE }; public class HelloWorld { public static void main(String[] args){ System.out.println(CoffeType.AMERICANO); System.out.println(CoffeType.ICE_AMERICANO); System.out.println(CoffeType.CAFE_LATTE); //반복문에서 사용할 수 도 있음 for (CoffeType type : CoffeType.values()) { System.out.println(type); } } } AMERICANO ICE_AMERICANO CAFE_LATTE AMERICANO ICE_AMERICANO CAFE_LATTEEnum을 사용하는 이유?
- 매직넘버를 사용할때보다 코드가 명확해진다 ( 매직넘버 : 프로그래밍에서 상수로 선언하지 않은 숫자)
- 잘못된 값을 사용함으로 인해 발생하는 위험생 사라짐
3-11 형변환과 final
형변환이란 자료형의 타입을 변경하는 것이다.
형변환 (기본적이지만 중요한 개념)
1. 문자열을 기본타입(int, double 등)으로 바꾸는 경우? : Wrapper클래스의 포장클래스(Integer,Double)이용
- Integer(포장클래스).parseInt(바꿀려는 기본타입);
public class HelloWorld { public static void main(String[] args){ String num = "124"; int n = Integer.parseInt(num); System.out.println(n); } }2. 기본타입을 문자열로 바꾸는 경우?
- 바꿀려는 타입 앞에 빈문자열("")을 더해준다.
- String.valueOf(바꿀려는 기본타입);
- 포장클래스.toString(바꿀려는 기본타입);
public class HelloWorld { public static void main(String[] args){ //빈문자열을 더해주는경우 int n = 123; String num = "" + n; System.out.println(num); int m = 123; String num1 = String.valueOf(m); //String.valueOf()이용 String num2 = Integer.toString(m); //포장클래스.toString()이용 System.out.println(num1); System.out.println(num2); } }3. 정수와 실수 사이의 형 변환 : 캐스팅과, 자동타입변환
public class HelloWorld { public static void main(String[] args){ //자동타입 변환 정수 -> 실수 int n1 =123; double d1 = n1; System.out.println(d1); //123.0 //강제타입 변환 (캐스팅) 실수 -> 정수 double d2 = 123.456; int n2 = (int) d2; System.out.println(n2); //123 } }final
자바의 final 자료형은 값을 한번 설정하면 그 값을 다시 수정하거나 설정할수 없다.
프로그램 수행 도중 그 값이 변경되면 안되는 상황에 사용한다.final 키워드를 사용함으로서 값의 재설정이 불가한 예와 , 리스트 재할당이 불가한 예를 보여준다.
import java.util.ArrayList; import java.util.Arrays; public class HelloWorld { public static void main(String[] args){ final int n = 123; //n = 456; compile error final ArrayList<String> a = new ArrayList<>(Arrays.asList("a", "b")); /*a = new ArrayList<>(Arrays.asList("c", "d"));System.out.println(a); error 발생 리스트 재할당 불가, add나 remove는 가능함 */ } }점프 투 자바
**초보 프로그래머를 위한 자바 입문서** 이 책은 문법위주의 지식보다는 이해중심의 지식을 전달하는 것을 주 목적으로 한다. 예를 들어 자바에서 잘 파악하기 힘든 개념 중 …
wikidocs.net
'java' 카테고리의 다른 글
[java] 클래스 (0) 2023.01.16 [java] 제어문(if,switch,while,for) (0) 2023.01.16 3장 연습문제 (0) 2023.01.15 [java] 명명규칙 (0) 2023.01.12 [java] java공부를 시작하며 (1) 2023.01.12