자바의 자료형

포모·2020년 11월 30일
0

JAVA의 기본

목록 보기
2/9

🎯 숫자

1. 정수

자료형표현 범위
int-2147483648 ~ 2147483647
long-9223372036854775808 ~ 9223372036854775807

byte, short 도 있지만 거의 사용하지 않습니다.


  • Long은 L을 붙입니다.
    long countOfStar = 8764827384923849L;

2. 실수

float pi = 3.14F;
double morePi = 3.14159265358979323846;

자바에서 실수형은 디폴트가 double이므로, float를 사용할 경우 접미사(f or F)를 붙여주어야합니다.

double d2 = 1.234e2;

과학적 지수 표현식으로 이렇게 표현할 수도 있습니다.


3. 진수

8진수는 0을, 16진수는 0x를 붙여서 표시합니다.

int octal = 023;    // 십진수: 19
int hex = 0xC;     // 십진수: 12

4. 숫자 연산

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);
    }
}

5. 증감 연산

++이나 --으로 표시합니다.

int i = 0;
System.out.println(i++);		// 0
System.out.println(i);			// 1

이때 위치에 주의해야합니다.

  • i++ : 값이 참조된 후에 증가
  • ++i : 값이 참조되기 전에 증가

🎯 Boolean

bool 연산

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 자료형을 가집니다.
'로 문자를 감싸야합니다. ("이면 안됩니다.)

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

System.out.println(a1);
System.out.println(a2);
System.out.println(a3);

🎯 String

자바에서 문자열에 해당하는 자료형이 string입니다.

String a = "Happy Java";

문자열은 객체를 만드는 방식으로 표현할 수도 있습니다.

String a = new String("Happy Java");
String b = new String("a");
String c = new String("123");

하지만 가독성의 이점과 컴파일 시 최적화에 도움을 주기 때문에 첫번째 방식(literal 방식)을 사용한다고 합니다.


primitive(원시) 자료형

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 표현식을 사용할 수 있도록 특별히 허용해주는 경우라고 합니다.)


📌 String method

equals

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 : 동일한 객체인지를 판별

indexOf

문자열에서 특정 문자가 시작되는 인덱스를 리턴합니다.

String a = "Hello Java";
System.out.println(a.indexOf("Java"));	// 6

java라는 문자열이 시작되는 인덱스인 6을 반환합니다.


replaceAll

문자열 중 특정 문자를 다른 문자로 바꾸고 싶을 경우에 사용합니다.

String a = "Hello Java";
System.out.println(a.replaceAll("Java", "World"));
// Hello World

substring

문자열 중 특정 부분을 뽑아낼 경우에 사용합니다.

String a = "Hello Java";
System.out.println(a.substring(0, 4));	// Hell

substring(start, end)라 할때 적용되는 문자 범위는
start <= x < end임에 주의해야합니다.


toUppperCase

문자열을 모두 대문자로 변경하고자 할 때 사용합니다. (모두 소문자로 변경할 때는 toLowerCase를 사용합니다.)

String a = "Hello Java";
System.out.println(a.toUpperCase());	// HELLO JAVA

🎯 StringBuffer

StringBuffer은 문자열을 추가하거나 변경할 때 주로 사용하는 자료형입니다.

append

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을 사용하는 것이 유리합니다.


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 자료형의 substring과 사용법이 동일하므로 생략하겠습니다.


🎯 Array

1. 배열의 길이 고정

String[] weeks = new String[7];
weeks[0] = "월";
weeks[1] = "화";
weeks[2] = "수";
weeks[3] = "목";
weeks[4] = "금";
weeks[5] = "토";
weeks[6] = "일";

배열 초기 선언에 배열의 길이를 설정하여 변수를 만든후, 값을 대입하는 방법입니다.
초기값 없이 배열 변수를 만들 때는 반드시 길이가 필요합니다.

String[] errorExample = new String[];	// error!

2. 배열의 값 접근

인덱싱을 이용하여 접근할 수 있습니다.

String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
System.out.println(weeks[3]);

3. 배열의 길이

array.length를 통해 접근할 수 있습니다.

4. 빈번한 배열의 오류

배열의 길이가 7인데 index가 7인(8번째 배열) 값을 얻으려고 하면 ArrayIndexOutOfBoundsException 오류가 발생합니다.


🎯 List

리스트는 배열과 비슷한 자바의 자료형으로 배열보다 편리한 기능을 많이 가지고 있습니다.
동적으로 자료형의 개수가 가변하는 상황에서는 List를 사용하는 것이 유리합니다.

List 자료형에는 ArrayList, LinkedList 등 List 인터페이스를 구현한 자료형이 있습니다.


add

ArrayList name = new ArrayList();
name.add("홍길동");
name.add("김철수");

name.add(0, "123");	// 0 인덱스에 123 삽입

자바 J2SE 5.0 버전 이후부터 ArrayList<String> name = new ArrayList<String>();과 같이 객체를 포함하는 자료형도 어떤 객체를 포함하는 지에 대한 명확한 표현을 권고하고 있습니다.


get

System.out.println(name.get(1));	// 김철수

size

System.out.println(name.size()); 	// 갯수 리턴

contains

리스트 안에 항목값이 있는 지 판별하여 결과를 boolean으로 리턴합니다.

System.out.println(name.contains("김영희"));	// false

remove

  • remove(객체) : 리스트에서 객체에 해당되는 항목을 삭제하고 삭제 결과를 리턴합니다.
System.out.println(name.remove("김철수"));		// true
  • remove(인덱스) : 해당 인덱스 항목을 삭제하고 삭제된 항목을 리턴합니다.
System.out.println(pitches.remove(0));		// 김철수

🎯 Generics

제네릭스(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

Map은 사전과 비슷합니다.
리스트나 배열처럼 순차적으로(sequential) 해당 요소 값을 구하지 않고 key를 통해 value를 얻는 다는 것이 가장 큰 특징입니다.

MapList처럼 인터페이스입니다. Map 인터페이스를 구현한 자료형에는 HashMap, LinkedHashMap, TreeMap 등이 있습니다.


LinkedHashMapTreeMap
입력된 key에 의해 정렬된 데이터를 가져오고 싶을 때 LinkedHashMap이나 TreeMap을 사용하는 것이 유리합니다.

  • LinkedHashMap : 입력된 순서대로 데이터가 출력됩니다.
  • TreeMap : 입력된 key의 정렬된 데이터가 출력됩니다.

put

HashMap<String, String> map = new HashMap<String, String>();
map.put("people", "사람");
map.put("baseball", "야구");

HashMap 역시 Generics 입니다. keyvalue 모두 String 타입으로 선언되었습니다.


get

System.out.println(map.get("people"));		// 사람

containsKey

System.out.println(map.containsKey("people"));	// true

remove

System.out.println(map.remove("people"));	// 사람

size

System.out.println(map.size());			// 1

🛴 마무리

ArryList와 배열, 그리고 Generics가 선언된 리스트들 등에 대한 궁금증이 조금이나마 해소되어서 후련하네요 🥳
그럼 객체지향으로 다시 돌아오겠습니다!!! 🙌


참고

0개의 댓글