자료형 | 표현 범위 |
---|---|
int | -2147483648 ~ 2147483647 |
long | -9223372036854775808 ~ 9223372036854775807 |
byte, short 도 있지만 거의 사용하지 않습니다.
L
을 붙입니다.long countOfStar = 8764827384923849L;
float pi = 3.14F;
double morePi = 3.14159265358979323846;
자바에서 실수형은 디폴트가 double이므로, float
를 사용할 경우 접미사(f
or F
)를 붙여주어야합니다.
double d2 = 1.234e2;
과학적 지수 표현식으로 이렇게 표현할 수도 있습니다.
8진수는 0
을, 16진수는 0x
를 붙여서 표시합니다.
int octal = 023; // 십진수: 19
int hex = 0xC; // 십진수: 12
public class FourArithmetic {
public static void main(String[] args) {
int a = 10;
int b = 5;
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
System.out.println(a/b);
System.out.println(a%b);
}
}
++
이나 --
으로 표시합니다.
int i = 0;
System.out.println(i++); // 0
System.out.println(i); // 1
이때 위치에 주의해야합니다.
i++
: 값이 참조된 후에 증가++i
: 값이 참조되기 전에 증가2 > 1 // 참
1 == 2 // 거짓
3 % 2 == 1 // 참 (3을 2로 나눈 나머지는 1이므로 참이다.)
"3".equals("2") // 거짓
조건문의 판단 기준으로 많이 사용됩니다.
int base = 180;
int height = 185;
boolean isTall = height > base;
if (isTall) { // boolean을 조건문에서 사용합니다.
System.out.println("키가 큽니다.");
}
한 개의 문자값은 char
자료형을 가집니다.
'
로 문자를 감싸야합니다. ("
이면 안됩니다.)
char a1 = 'a'; // 문자
char a2 = 97; // 아스키코드
char a3 = '\u0061'; // 유니코드
System.out.println(a1);
System.out.println(a2);
System.out.println(a3);
자바에서 문자열에 해당하는 자료형이 string
입니다.
String a = "Happy Java";
문자열은 객체를 만드는 방식으로 표현할 수도 있습니다.
String a = new String("Happy Java");
String b = new String("a");
String c = new String("123");
하지만 가독성의 이점과 컴파일 시 최적화에 도움을 주기 때문에 첫번째 방식(literal 방식)을 사용한다고 합니다.
int, long, double, float, boolean, char 등을 자바는 primitive 자료형이라고 부릅니다.
이런 primitive 자료형은 new
키워드로 생성할 수 있습니다.
primitive 자료형은 다음과 같이 literal로 값을 세팅할 수 있습니다.
(literal : 계산식 없이 소스 코드에 표기하는 상수 값)
boolean result = true;
char capitalC = 'C';
int i = 100000;
String은 literal 표기가 가능하지만, primitive 자료형은 아닙니다. (그러나 literal 표현식을 사용할 수 있도록 특별히 허용해주는 경우라고 합니다.)
equals
는 두 개의 문자열이 동일한 값을 가지고 있는 지 비교하여 결과값을 리턴하는 함수입니다.
String a = "hello";
String b = new String("hello");
System.out.println(a.equals(b)); // true
System.out.println(a==b); // false
a.equals(b)
: 동일한 값인지를 판별a==b
: 동일한 객체인지를 판별문자열에서 특정 문자가 시작되는 인덱스를 리턴합니다.
String a = "Hello Java";
System.out.println(a.indexOf("Java")); // 6
java라는 문자열이 시작되는 인덱스인 6을 반환합니다.
문자열 중 특정 문자를 다른 문자로 바꾸고 싶을 경우에 사용합니다.
String a = "Hello Java";
System.out.println(a.replaceAll("Java", "World"));
// Hello World
문자열 중 특정 부분을 뽑아낼 경우에 사용합니다.
String a = "Hello Java";
System.out.println(a.substring(0, 4)); // Hell
substring(start, end)
라 할때 적용되는 문자 범위는
start <= x < end
임에 주의해야합니다.
문자열을 모두 대문자로 변경하고자 할 때 사용합니다. (모두 소문자로 변경할 때는 toLowerCase
를 사용합니다.)
String a = "Hello Java";
System.out.println(a.toUpperCase()); // HELLO JAVA
StringBuffer
은 문자열을 추가하거나 변경할 때 주로 사용하는 자료형입니다.
StringBuffer sb = new StringBuffer();
sb.append("hello");
sb.append(" ");
sb.append("jump to java");
System.out.println(sb.toString());
// hello jump to java
StringBuffer
자료형은 append()
를 이용해 문자열을 추가해 나갈 수 있습니다. 그리고 toString()
함수를 이용해 String 자료형으로 변경할 수 있습니다.
String과 StringBuffer의 차이점? 🤔
StringBuffer
: 객체가 단 한번 생성됩니다.String
:+
연산이 있을 때마다 새로운String
객체가 생성됩니다.
String
자료형은 한번 생성되면 그 값을 변경할 수 없습니다. (이것을 immutable 하다고 표현합니다.)
trim
,toUpperCase
등의 메소드를 보면 문자열이 변경되는 것 처럼 보이나, 사실상 새로운String
객체를 생성하여 리턴하는 것입니다.
이와 반대로StringBuffer
은 값을 변경할 수 있습니다. (mutable 하다)
즉 한 번 생성된 값을 언제든 수정할 수 있습니다.
이와 같이 두 자료형은 비슷한 기능을 수행하나 내부의 객체가 생성되고 메모리가 사용되는 과정이 다릅니다.
하지만, StringBuffer
가 항상 좋은 것은 아닙니다.
new StringBuffer()
로 객체를 생성하는 것은 일반 String
을 사용하는 것보다 메모리 사용량도 많고 속도도 느립니다.
따라서 문자열 추가나 변경 작업이 많은 경우 StringBuffer
를,
문자열 변경 작업이 거의 없는 경우 String
을 사용하는 것이 유리합니다.
특정 위치에 원하는 문자열을 삽입하는 함수입니다.
StringBuffer sb = new StringBuffer();
sb.append("jump to java");
sb.insert(0, "hello ");
System.out.println(sb.toString());
// hello jump to java
String
자료형의 substring
과 사용법이 동일하므로 생략하겠습니다.
String[] weeks = new String[7];
weeks[0] = "월";
weeks[1] = "화";
weeks[2] = "수";
weeks[3] = "목";
weeks[4] = "금";
weeks[5] = "토";
weeks[6] = "일";
배열 초기 선언에 배열의 길이를 설정하여 변수를 만든후, 값을 대입하는 방법입니다.
초기값 없이 배열 변수를 만들 때는 반드시 길이가 필요합니다.
String[] errorExample = new String[]; // error!
인덱싱을 이용하여 접근할 수 있습니다.
String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
System.out.println(weeks[3]);
array.length
를 통해 접근할 수 있습니다.
배열의 길이가 7인데 index가 7인(8번째 배열) 값을 얻으려고 하면 ArrayIndexOutOfBoundsException
오류가 발생합니다.
리스트는 배열과 비슷한 자바의 자료형으로 배열보다 편리한 기능을 많이 가지고 있습니다.
동적으로 자료형의 개수가 가변하는 상황에서는 List를 사용하는 것이 유리합니다.
List 자료형에는 ArrayList, LinkedList 등 List 인터페이스를 구현한 자료형이 있습니다.
ArrayList name = new ArrayList();
name.add("홍길동");
name.add("김철수");
name.add(0, "123"); // 0 인덱스에 123 삽입
자바 J2SE 5.0 버전 이후부터
ArrayList<String> name = new ArrayList<String>();
과 같이 객체를 포함하는 자료형도 어떤 객체를 포함하는 지에 대한 명확한 표현을 권고하고 있습니다.
System.out.println(name.get(1)); // 김철수
System.out.println(name.size()); // 갯수 리턴
리스트 안에 항목값이 있는 지 판별하여 결과를 boolean으로 리턴합니다.
System.out.println(name.contains("김영희")); // false
System.out.println(name.remove("김철수")); // true
System.out.println(pitches.remove(0)); // 김철수
제네릭스(Generics)는 자바 J2SE 5.0 이후 도입된 개념입니다.
Generics
란, ArrayList가 다룰 객체를 미리 명시해줌으로써 형변환을 하지 않고 사용하는 것을 말합니다.
Generics
는 타입의 안정성을 제공하고 타입 체크와 형변환을 생략할 수 있어 코드가 간결해지기 때문에 사용합니다.
Generics
타입은<Integer>
,<Dog>
등 어떤 자료형도 사용할 수 있습니다.
// Generics 도입 전
ArrayList aList = new ArrayList();
// Generics 도입 후
ArrayList<String> aList = new ArrayList<String>();
JSSE 5.0 이후 버전에서는 도입 전 방법도 코드 작성 오류가 나지는 않는다고 합니다. 다만 제네릭스 타입을 명확히 지정하라는 warning 메시지가 출력됩니다.
Generics
타입을 사용하지 않은 경우ArrayList aList = new ArrayList();
aList.add("hello");
aList.add("java");
String hello = (String) aList.get(0);
String java = (String) aList.get(1);
Generics
타입을 사용하지 않은 경우 ArrayList 안에 추가되는 객체는 Object
자료형으로 인식됩니다. (Object
는 모든 객체가 상속하는 가장 기본적인 자료형입니다.)
따라서 aList
객체의 값을 가져올 때 항상 형변환(casting
)을 해줘야합니다.
또한aList
객체에는 String
객체 외에도 다양한 객체를 넣을 수 있기 때문에 형변환 과정에서 잘못된 형변환으로 인한 오류가 발생할 수 있습니다.
Generics
타입을 사용한 경우ArrayList<String> aList = new ArrayList<String>();
aList.add("hello");
aList.add("java");
String hello = aList.get(0);
String java = aList.get(1);
Generics
로 자료형을 선언하면 이미 컴파일러가 aList
객체에 반드시 String
자료형만 추가되어야함을 알기때문에 자료형에 대한 형변환 과정이 필요없습니다.
Generics
를 이용하면 형변환에 의한 불필요한 코딩, 잘못된 형변환에 의한 런타임 오류 등에서 벗어날 수 있습니다.
Map
은 사전과 비슷합니다.
리스트나 배열처럼 순차적으로(sequential) 해당 요소 값을 구하지 않고 key를 통해 value를 얻는 다는 것이 가장 큰 특징입니다.
Map
도List
처럼 인터페이스입니다.Map
인터페이스를 구현한 자료형에는HashMap
,LinkedHashMap
,TreeMap
등이 있습니다.
LinkedHashMap
과TreeMap
입력된key
에 의해 정렬된 데이터를 가져오고 싶을 때LinkedHashMap
이나TreeMap
을 사용하는 것이 유리합니다.
LinkedHashMap
: 입력된 순서대로 데이터가 출력됩니다.TreeMap
: 입력된key
의 정렬된 데이터가 출력됩니다.
HashMap<String, String> map = new HashMap<String, String>();
map.put("people", "사람");
map.put("baseball", "야구");
HashMap
역시Generics
입니다.key
와value
모두String
타입으로 선언되었습니다.
System.out.println(map.get("people")); // 사람
System.out.println(map.containsKey("people")); // true
System.out.println(map.remove("people")); // 사람
System.out.println(map.size()); // 1
ArryList
와 배열, 그리고 Generics
가 선언된 리스트들 등에 대한 궁금증이 조금이나마 해소되어서 후련하네요 🥳
그럼 객체지향으로 다시 돌아오겠습니다!!! 🙌