본문 바로가기
Skills/Java

점프 투 자바 정리 (1) (자바와 자료형)

by Hoseok 2022. 10. 21.
728x90
반응형

 

자바 시작하기

 

자바의 특징

 

자바를 개발한 선 마이크로 시스템즈는 자바를 아래와 같이 정의하였다.

 

Java: A simple, object-oriented, distributed, interpreted, robust, secure, architecture neutral, portable, high-performance, multithreaded, and dynamic language

 

자바: 간단하다, 객체 지향적이다, 인터프리터 언어이다, 강력하다, 안전하다, 플랫폼 독립적이다, 멀티 쓰레딩을 지원한다, 동적이다

 

이 중 다음 두 가지는 꼭 기억하자.

 

객체 지향적이다 (Object-oriented)

 

자바는 숫자(int, float, long 등)나 논리값(true, false)을 제외한 거의 모든 것이 객체로 구성되어 있다. 실제로 자바는 Object 클래스에서 모든 클래스를 파생한다.

 

인터프리터 언어이다 (Interpreted)

 

자바는 정확하게 말하면 컴파일 언어인 동시에 인터프리터 언어이다. 자바는 먼저 텍스트 소스를 컴파일하여 2진 파일(클래스 파일)로 만든 다음 자바 런타임이 클래스 파일을 인터프리트하면서 실행한다. 먼저 시스템에 무관한 2진 파일을 만듬으로써 자바는 컴파일 언어에 가까운 속도와 시스템 독립성을 동시에 얻을 수 있었다.

 

자바 소스코드의 구조

 

보통 일반적인 자바 소스코드는 다음과 같은 형태로 만들어 진다.

 

클래스명.java

/* 클래스 블록 */
public class 클래스명 {

    /* 메소드 블록 */
    [public|private|protected] [static] (리턴자료형|void) 메소드명1(입력자료형 매개변수, ...) {
        명령문(statement);
        ...
    }

소스코드의 예

 

다음의 가장 간단한 샘플로 실제 소스코드의 구조에 대해서 자세히 알아보자.

 

Sample.java

public class Sample {
    public static void main(String[] args) {
        System.out.println("Hello java");
    }
}

 

변수와 자료형

 

변수명

 

다음 예와 같은 a, b를 변수(variable)라고 한다.

int a;
String b;

단, 변수의 이름을 지을 때는 다음과 같이 지켜야 할 몇가지 규칙이 있다.

  • 변수명은 숫자로 시작할 수 없다.
  • _(underscore) 와 $ 문자 이외의 특수문자는 사용할 수 없다.
  • 자바의 키워드는 변수명으로 사용할 수 없다. (예: int, class, return 등)

자료형 (Type)

 

변수명 앞의 int, String 등은 변수의 자료형(Type)을 뜻한다.

int a; 라는 문장은 다음과 같이 해석된다.

"변수a 는 int 자료형 변수이다." 즉, a라는 변수에는 int 자료형 값(예: 1, 10, 25 등의 정수)만 담을 수 있다.

String b; 라는 문장은 다음과 같이 해석된다.

"변수 b는 String 자료형 변수이다." 즉, b라는 변수에는 String 자료형 값(예: "a", "hello" 등의 문자열)만 담을 수 있다.

 

사용자 정의 자료형

뒤에서 자세하게 공부하겠지만 사용자가 직접 자료형을 만들 수도 있다.

예를 들어 다음과 같이 Animal 이라는 클래스를 만들면,

class Animal {
}

다음과 같이 Animal 자료형 변수를 만들 수 있다.

 

명명 규칙

 

클래스 명

  • 클래스명은 명사로 한다.
  • 여러개의 단어가 섞이는 경우 각 단어의 첫번째 문자는 대문자이어야 한다. (CamelCase라고도 한다)

메소드 명

  • 메소드명은 동사로 한다.
  • 클래스명과 마찬가지로 여러개의 단어가 섞이는 경우 각 단어의 첫번째 문자는 대문자이어야 한다. 단, 처음 시작하는 문자는 항상 소문자로 시작한다.

변수 명

 

  • 변수 이름은 짧지만 의미가 있어야 한다. (변수명을 통해 변수의 사용 의도를 알 수 있게 지어야 한다.)
  • 순서를 의미하는 임시적인 정수의 변수명은 i, j, k, m, n을 사용한다. (문자의 경우는 c, d, e 등을 사용한다.)
  • 변수명에 _, $ 기호를 사용할 수 있지만 시작 문자로 사용하지 않는다.

자료형

 

숫자(Number)

 

정수

 

자바의 정수를 표현하기 위한 자료형은 int, long 이다. (byte, short 등도 있지만 잘 사용하지 않는다.)

int와 long의 차이는 표현할 수 있는 숫자의 범위이다.

 

자료형 표현 범위

int -2147483648 ~ 2147483647
long -9223372036854775808 ~ 9223372036854775807

long 변수에 값을 대입할 때는 대입하는 숫자 값이 int 자료형의 최대값인 2147483647 보다 큰 경우 8764827384923849L과 같이 L 접미사(또는 소문자 l, 소문자 'l'은 숫자 1과 비슷하게 보이므로 추천하지 않는다.)를 붙여 주어야 한다. 만약 큰 숫자에 'L'과 같은 접미사를 누락하면 컴파일 에러가 발생한다.

 

실수

 

자바의 실수를 표현하기 위한 자료형은 float, double 이다.

float와 double의 차이 역시 표현할 수 있는 숫자의 범위이다.

 

자료형 표현 범위

float −3.4∗1038 ~ 3.4∗1038
double −1.7∗10308 ~ 1.7∗10308

자바에서 실수형은 디폴트가 double이므로 위의 예에서 보듯이 float 변수에 값을 대입할 때에는 3.14F 와 같이 F접미사(또는 소문자 f)를 꼭 붙여 주어야 한다. float 자료형에 값을 대입할 때 접미사를 누락하면 컴파일 에러가 발생한다.

 

8진수와 16진수

 

8진수와 16진수는 int 자료형을 사용하여 표시한다.

0(숫자 '0')으로 시작하면 8진수, 0x(숫자 '0' + 알파벳 'x')로 시작하면 16진수가 된다.

 

불리언(Boolean)

 

참 또는 거짓의 값을 갖는 자료형을 불 자료형이라고 한다.

 

boolean isSuccess = true;

boolean isTest = false;

 

자료형의 명칭은 boolean(불린 또는 불리언이라고 부른다)이다.

불 자료형에 대입되는 값은 참(true) 또는 거짓(false)만 가능하다.

 

문자(Char)

 

한 개의 문자 값에 대한 자료형은 char 를 이용한다.

char a1 = 'a';

주의할 점은 위와같이 문자값을 '(단일 인용부호)로 감싸주어야 한다는 점이다.

활용성은 매우 적다.

 

문자열(String)

 

문자열이란 문장을 뜻한다. 예를 들어 다음과 같은 것들이 문자열이다.

"Happy Java"  
"a"  
"123"

자바에서 문자열을 나타내는 자료형은 String 이다.

 

StringBuffer

 

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

 

배열(Array)

 

1부터 10까지의 숫자들 중 홀수들의 집합은 다음과 같이 int 배열로 표현 할 수 있다.

int[] odds = {1, 3, 5, 7, 9};

배열은 자료형 타입 바로 옆에 [] 기호를 사용하여 표현한다. 위 예제와 같이 int 자료형의 배열은 int[] 로 표현되었다.

요일의 집합은 다음과 같이 String 배열로 표현 할 수 있다.

String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};

즉, 배열이란 자료형의 종류가 아닌 자료형의 집합을 의미한다.

배열의 길이는 고정되어 있다

위에서 살펴본 요일의 집합 예제는 다음과 같이 고쳐 쓸 수 있다.

String[] weeks = new String[7];

리스트(List)

 

리스트는 배열과 비슷한 자바의 자료형으로 배열보다 편리한 기능을 많이 가지고 있다.

 

리스트와 배열의 가장 큰 차이는 크기가 정해져 있지 않고 동적으로 변한다는 점이다.

 

배열은 크기가 정해져 있다.

 

예를 들어 배열의 크기를 10개로 정했다면 10개 이상의 값을 담을 수는 없다. 하지만 리스트는 크기가 정해져 있지 않아 원하는 만큼의 값을 담을 수 있다.

 

ArrayList

 

List 자료형 중 가장 간단한 형태의 자료형인 ArrayList에 대해서 알아보자.

 

List 자료형에는 ArrayList, Vector, LinkedList 등의 List 인터페이스를 구현한 자료형이 있다. 여기서 말하는 List 자료형은 인터페이스인데 인터페이스에 대해서는 뒤에서 자세히 다루도록 한다.

 

add

 

박찬호 선수가 총 3번의 투구를 138, 129, 142(km) 의 속도록 던졌다면 다음과 같이 코드를 작성할 수 있다.

import java.util.ArrayList;

public class Sample {
    public static void main(String[] args) {
        ArrayList pitches = new ArrayList();
        pitches.add("138");
        pitches.add("129");
        pitches.add("142");
    }
}

※ ArrayList를 사용하기 위해서는 import java.util.ArrayList와 같이 ArrayList를 먼저 import해야 한다.

ArrayList 객체인 pitches에 add 라는 메소드를 이용하여 투구 스피드를 저장했다. 만약 첫번째 위치에 "133"이라는 투구 스피드를 삽입하고 싶다면 아래와 같이 삽입할 위치를 파라미터로 넘겨주어야 한다.

pitches.add(0, "133");    // 첫번째 위치에 133 삽입.

만약 2번 째 위치에 133을 삽일 할 경우에는 다음과 같이 코딩하면 된다.

pitches.add(1, "133");

 

*제네릭스

 

자바는 J2SE 5.0 버전 이후부터 ArrayList<String> pitches = new ArrayList<>(); 처럼 객체를 포함하는 자료형도 어떤 객체를 포함하는지에 대해서 명확하게 표현할 것을 권고하고 있다. 인텔리제이에서 위의 예제와 같이 제네릭스 없이 코딩하면 명확한 타입을 명시하라는 warning이 표시될 것이다.

 

맵(Map)

 

"사람"을 예로 들면 누구든지 "이름" = "홍길동", "생일" = "몇 월 며칠" 등으로 구분할 수 있다. 자바의 맵(Map)은 이러한 대응관계를 쉽게 표현할 수 있게 해 주는 자료형이다. 이것은 요즘 나오는 대부분의 언어들도 갖고 있는 자료형으로 Associative array, Hash라고도 불린다.

 

맵(Map)은 사전(dictionary)과 비슷하다. 즉, people 이란 단어에 "사람", baseball 이라는 단어에 "야구"라는 뜻이 부합되듯이 Map은 Key와 Value를 한 쌍으로 갖는 자료형이다.

 

key/value

people 사람
baseball 야구

Map은 리스트나 배열처럼 순차적으로(sequential) 해당 요소 값을 구하지 않고 key를 통해 value를 얻는다. 맵(Map)의 가장 큰 특징이라면 key로 value를 얻어낸다는 점이다.

 

HashMap

 

자바의 맵(Map)중 가장 간단한 HashMap에 대해서 알아보자.

 

점프 투 자바Map 역시 List와 마찬가지로 인터페이스이다. Map 인터페이스를 구현한 Map자료형에는 HashMap, LinkedHashMap, TreeMap등이 있다.

 

인터페이스에 대해서는 객체지향 챕터에서 자세하게 다룰 것이다.

 

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", "야구");
    }
}

key와 value는 위 예제에서 보듯이 put메소드를 이용하여 입력했다.

※ HashMap 역시 제네릭스를 이용한다. 위의 HashMap 의 제네릭스는 Key, Value 모두 String 타입이다.

get

 

key에 해당되는 value값을 얻기 위해서는 다음과 같이 한다.

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

위와같이 get 메소드를 이용하면 value값을 얻을 수 있다. 위 예제는 "people" Key에 대응되는 Value 값으로 "사람"이라는 문자열을 출력할 것이다.

 

LinkedHashMap과 TreeMap

 

Map의 가장 큰 특징은 순서에 의존하지 않고 key로 value를 가져오는데 있다. 하지만 가끔은 Map에 입력된 순서대로 데이터를 가져오고 싶은 경우도 있고 때로는 입력된 key에 의해 소트된 데이터를 가져오고 싶을 수도 있을 것이다. 이런경우에는 LinkedHashMap과 TreeMap을 사용하는 것이 유리하다.

  • LinkedHashMap은 입력된 순서대로 데이터를 저장하는 특징을 가지고 있다.
  • TreeMap은 입력된 key의 오름차순 순서로 데이터를 저장하는 특징을 가지고 있다.

집합(Set)

 

집합(Set) 자료형은 집합과 관련된 것을 쉽게 처리하기 위해 만든 자료형이다.

집합 자료형은 어떻게 만들까?

집합 자료형은 다음과 같이 HashSet을 사용하여 만들 수 있다.

import java.util.Arrays;
import java.util.HashSet;

public class Sample {
    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] 출력
    }
}

 

Set 자료형

 

Set 자료형에는 HashSet, TreeSet, LinkedHashSet 등의 Set 인터페이스를 구현한 자료형이 있다. 여기서 말하는 Set 자료형은 인터페이스인데 인터페이스에 대해서는 뒤에서 자세히 다루도록 한다.

 

집합 자료형의 특징

 

자, 그런데 위에서 살펴본 출력 결과가 좀 이상하지 않은가? 분명 "H", "e", "l", "l", "o" 라는 문자열 배열로 HashSet 자료형을 만들었는데 출력된 자료형에는 l 문자가 하나 빠져 있고 순서도 뒤죽박죽이다. 그 이유는 집합 자료형에는 다음과 같은 2가지 큰 특징이 있기 때문이다.

  • 중복을 허용하지 않는다.
  • 순서가 없다(Unordered).

리스트나 배열은 순서가 있기(ordered) 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있지만 집합 자료형은 순서가 없기(unordered) 때문에 인덱싱으로 값을 얻을 수 없다. 이는 마치 맵 자료형과 비슷하다. 맵 자료형 역시 순서가 없는 자료형이라 인덱싱을 지원하지 않는다.

※ 중복을 허용하지 않는 집합 자료형의 특징은 자료형의 중복을 제거하기 위한 필터 역할로 종종 사용한다.

 

TreeSet과 LinkedHashSet

 

Set 자료형은 순서가 없다는 특징이 있다. 하지만 가끔은 Set에 입력된 순서대로 데이터를 가져오고 싶은 경우도 있고 때로는 오름차순으로 정렬된 데이터를 가져오고 싶을 수도 있을 것이다. 이런경우에는 TreeSet과 LinkedHashSet을 사용한다.

  • TreeSet - 오름차순으로 값을 정렬하여 저장하는 특징이 있다.
  • LinkedHashSet - 입력한 순서대로 값을 정렬하여 저장하는 특징이 있다.

상수집합(Enum)

Enum은 서로 관련이 있는 여러 개의 상수 집합을 정의할 때 사용하는 자료형이다.

Enum 만들기

예를 들어 어떤 커피숍에서 판매하는 커피의 종류가 다음과 같다고 가정해 보자.

  • 아메리카노
  • 아이스 아메리카노
  • 카페라떼

이와 같이 3종류의 커피를 판매한다고 하면 다음과 같이 Enum 으로 상수집합을 만들수 있다.

enum CoffeeType {
    AMERICANO,
    ICE_AMERICANO,
    CAFE_LATTE
};

즉, 정리해 보면 다음과 같은 장점이 있다.

  • 매직넘버(1과 같은 숫자 상수값)를 사용할 때보다 코드가 명확해 진다.
  • 잘못된 값을 사용함으로 인해 발생할수 있는 위험성이 사라진다.

※ 프로그래밍에서 상수로 선언하지 않은 숫자를 매직넘버라고 한다.

형변환과 final

 

형변환

다음과 같은 문자열을 보자.

String num = "123";

자료형은 문자열이지만 그 내용은 숫자로 이루어진 값이다. 이럴 경우에 문자열을 정수(integer)로 바꿀수 있다. 문자열을 정수로 바꾸려면 다음과 같이 Integer 클래스를 사용한다.

※ Integer는 int자료형의 Wrapper 클래스이다.

public class Sample {
    public static void main(String[] args) {
        String num = "123";
        int n = Integer.parseInt(num);
        System.out.println(n);  // 123 출력
    }
}

이번에는 반대로 정수 123을 문자열 "123"으로 바꾸는 방법에 대해서 알아보자. 정수를 문자열로 바꾸는 가장 쉬운 방법은 정수 앞에 빈문자열("")을 더해 주는 것이다.

public class Sample {
    public static void main(String[] args) {
        int n = 123;
        String num = "" + n;
        System.out.println(num);  // 123 출력
    }
}

또는 다음과 같이 변환할 수도 있다.

public class Sample {
    public static void main(String[] args) {
        int n = 123;
        String num1 = String.valueOf(n);
        String num2 = Integer.toString(n);
        System.out.println(num1);  // 123 출력
        System.out.println(num2);  // 123 출력
    }
}

실제 프로젝트에서 정수와 문자열 사이의 변환은 매우 자주 사용한다.

 

final

 

자바의 final은 자료형에 값을 단 한번만 설정할수 있게 강제하는 키워드이다. 즉, 값을 한번 설정하면 그 값을 다시 설정할 수 없다는 말이다.

public class Sample {
    public static void main(String[] args) {
        final int n = 123;  // final 로 설정하면 값을 바꿀수 없다.
        n = 456;  // 컴파일 에러 발생
    }
}

리스트의 경우도 final로 선언시 재할당은 불가능하다.

 

final은 프로그램 수행 도중 그 값이 변경되면 안되는 상황에 사용한다.

 

Unmodifiable List

리스트의 경우 final로 선언시 리스트에 값을 더하거나(add) 빼는(remove) 것은 가능하다. 다만 재할당만 불가능할 뿐이다. 만약 그 값을 더하거나 빼는 것도 불가능하게 하고 싶은 경우에는 List.of로 수정이 불가능한 리스트(Unmodifiable List)를 생성해야 한다.

import java.util.List;

public class Sample {
    public static void main(String[] args) {
        final List<String> a = List.of("a", "b");
        a.add("c");  // UnsupportedOperationException 발생
    }
}

 

 

 

 


 

 

Copyright 2022. 박응용 all rights reserved. ​

책과 관련된 모든 저작권은 저자 박응용님에게 있습니다.

https://wikidocs.net/book/31

728x90
반응형