JAVA

변수와 자료형

오승미 2023. 10. 10. 14:23

변수 개념

- 변수: 데이터를 저장하는 메모리 공간에 붙여준 이름

선언(Declaration):  변수를 컴파일러에게 알려주는 것
초기화(Initialization): 변수를 사용하기 위해 공간에 특정 값으로 할당해주는 것
public class SimpleClass {

    // 변수 선언 및 초기화
    int number = 10;          // 정수형 변수
    double decimalNumber = 5.5; // 실수형 변수
    char character = 'A';     // 문자형 변수
    boolean flag = true;      // 불리언형 변수
    String text = "Hello";    // 문자열형 변수

    // 메인 메서드
    public static void main(String[] args) {
        // 클래스의 인스턴스 생성
        SimpleClass example = new SimpleClass();

        // 변수 값 출력
        System.out.println("Integer: " + example.number);
        System.out.println("Double: " + example.decimalNumber);
        System.out.println("Char: " + example.character);
        System.out.println("Boolean: " + example.flag);
        System.out.println("String: " + example.text);
    }
}

 

표기법

- 카멜 표기법(camelCase): 가장 앞 소문자, 나머지 단어의 첫 문자는 대문자

- 파스칼 표기법(PascalCase): 각 문자의 첫 문자를 대문자로 표기

 

JAVA 변수 명명 규칙

- 대소문자를 구분 (simple != Simple)

- 첫 번째 글자는 문자이거나 '$', '_' 이어야 함

- 숫자로 시작할 수 없음

- 카멜 케이스 명명 규칙을 따름

- 예약어(지정된 키워드)는 변수의 이름으로 사용할 수 없음

 

상수와 리터럴

상수

- 한 번 선언과 초기화를 하면 재정의할 수 없는

리터럴

- 어떤 변수에 선언되는 값, 즉 데이터 그 자체

 

입력과 출력

입력

- 실행 시 Argument로 넘겨 받는 방법

- 실행 시 키보드로 입력

출력

- java에서 기본적으로 제공해주는 print 메서드 사용

print(), println(), printf()

 

자료형(Data Type)

- 변수의 종류, 단위: 숫자(Number), 부울(Boolean), 문자(Character), 문자열(String), ...

- 변수의 종류에 따라 담을 수 있는 데이터의 타입과 크기가 다르다.

숫자

- 숫자 형태의 자료형(정수/실수/2진수, 8진수, 16진수)

- 정수: int, long, byte, short

소수를 포함하지 않음

주로 int형을 사용하며, 이진 데이터를 다룰 땐 byte를 많이 사용

- 실수: float, double

소수를 포함한 데이터 타입

실수형은 정수형과 저장방식이 다르기 때문에 같은 크기라도 큰 값을 표현 가능(데이터 표현 범위를 크게 하여 정밀도를 높임)

- 2진수, 8진수, 16진수

10진수: 0~9
2진수: 0, 1 (int 자료형을 2진수로 사용하려면 0b를 앞에 붙임)
8진수: 0~7 (int 자료형을 8진수로 사용하려면 0 앞에 붙임)
16진수: 0~9, A~F (int 자료형을 16진수로 사용하려면 0x를 앞에 붙임)
//상수 참조하기

/*
Integer.MAX_VALUE+1을 출력하면 max데이터를 넘어가 다시 음수가 나온다.
따라서 Long type을 사용해야 잘못 출력되지 않는다.
(long)Integer.MAX_VALUE 
*/
MAX_VALUE 
MIN_VALUE

//Integer class의 메서드 사용하기
Integer.toBinaryString() //2진수 변환
Integer.toOctalString()	//8진수 변환
Integer.toHexString()	//16진수 변환

부울

- 참과 거짓을 나타내는 자료 (true/false)

- 조건식과 논리식 계산에 사용

- boolean

- true, false 두 값만 표현하면 되기에 1바이트로 가능

 

문자

- 한 개의 문자 표현에 사용되는 자료형

- int형으로 변환하면 아스키 코드 값으로 변환되어 출력된다.

- char

- java에서 유니코드(2byte) 문자 체계를 사용

 

문자열(String)

- 문자들로 이루어진 집합

- 문자열 메소드: equals, indexOf, replace, substring, toUpperCase ...

 '==' 는 객체 비교이고, equals는 값 비교이다. 따라서 new String 으로 객체를 생성하고 '==' 를 사용해 비교하면 false가 나온다. equals로 비교해야 원하는 값을 얻을 수 있다.
substring은 기존 문자열에서 부분 문자열을 뽑는 메서드이다.
// indexOf와 substring 혼용해보기
s.substring(0, s.indexOf("!")+1);
//첫 글자부터 느낌표까지 출력된다.

 

StringBuffer

- 문자열을 자주 추가하거나 변경할 때 사용하는 자료형

- 문자열 연결, 삽입, 삭제 등의 연산을 할 때 StringBuffer를 사용하면 효율적이다. String 객체는 불변(immutable)이기 때문에 문자열을 수정할 때마다 새로운 String 객체가 생성되는데, StringBuffer는 이러한 문제를 해결해 준다.

- stringBuffer 메소드: append, insert, substring ...

public class StringBufferExample {
    public static void main(String[] args) {
        StringBuffer buffer = new StringBuffer("Hello");
        
        // 문자열에 문자열 추가
        buffer.append(" World");
        
        // 특정 인덱스에 문자열 삽입
        buffer.insert(5, ",");
        
        // 특정 인덱스의 문자 삭제
        buffer.deleteCharAt(5);
        
        // 문자열의 일부를 다른 문자열로 대체
        buffer.replace(0, 5, "Hi");

        System.out.println(buffer.toString()); // 출력: Hi World
    }
}

 

배열

- 많은 수의 데이터를 담을 수 있는 자료

- index와 element로 구성됨

 

< 배열의 활용 >

- enhanched for 문 (for-each 문)

요소의 값을 변경하기에는 적합하지 않음

public class EnhancedForExample {
    public static void main(String[] args) {
        // 1차원 정수형 배열 선언 및 초기화
        int[] numbers = {1, 2, 3, 4, 5};

        // enhanced for문을 사용하여 배열의 각 요소 출력
        for (int number : numbers) {
            System.out.println(number);
        }
    }
}

 

- 배열의 복사

int[] original = {1, 2, 3, 4, 5};
int[] copy = new int[original.length];

System.arraycopy(original, 0, copy, 0, original.length);
int[] original = {1, 2, 3, 4, 5};
int[] copy = original.clone();
int[] original = {1, 2, 3, 4, 5};
int[] copy = Arrays.copyOfRange(original, 1, 4); // 2, 3, 4 복사

 

리스트

- 배열과 같이 여러 데이터를 담을 수 있는 자료형

- 추가로 여러가지 메소드를 제공

- 리스트 메소드: add, get, size, remove, clear, sort, contains, ...

- ArrayList list = new ArrayList();

import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        // ArrayList에 요소 추가
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");
        //ArrayList 특정 인덱스에 요소 추가
        list.add(3, "Orange");

        // ArrayList에서 요소 얻기
        System.out.println(list.get(1));  // 출력: Banana

        // ArrayList에 있는 요소의 개수 얻기
        System.out.println(list.size());  // 출력: 4

        // ArrayList에서 요소 삭제
        list.remove(1);
        //list.remove("Banana");

        // ArrayList가 특정 요소를 포함하고 있는지 확인
        if (list.contains("Banana")) {
            System.out.println("Banana is in the list");
        } else {
            System.out.println("Banana is not in the list");  // 출력: Banana is not in the list
        }

        // ArrayList의 모든 요소 출력
        for (String fruit : list) {
            System.out.println(fruit);
        }
        // 출력:
        // Apple
        // Cherry
        // Orange
        
        //오름차순 정렬
        list.sort(Comparator.naturalOrder());
        //내림차순 정렬
        list.sort(Comparator.reverseOrder());
        
        list.clear();
    }
}

 

- key, value 형태로 데이터를 저장하는 자료형

- 맵 메소드: put, get, size, remove, containsKey, ...

- HashMap<String, String> hashMap = new HashMap<String, String>();

- python의 dictionary와 비슷한 형태이다.

import java.util.HashMap;

public class HashMapExample {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();

        // HashMap에 키와 값 쌍 추가
        map.put("Alice", 25);
        map.put("Bob", 30);
        map.put("Charlie", 35);

        // HashMap에서 키로 값을 얻기
        System.out.println(map.get("Alice"));  // 출력: 25

        // HashMap에 있는 키-값 쌍의 개수 얻기
        System.out.println(map.size());  // 출력: 3

        // HashMap에서 특정 키-값 쌍 삭제
        map.remove("Bob");

        // HashMap에 특정 키가 있는지 확인
        if (map.containsKey("Bob")) {
            System.out.println("Bob is in the map");
        } else {
            System.out.println("Bob is not in the map");  // 출력: Bob is not in the map
        }

        // HashMap의 모든 키-값 쌍 출력
        for (String key : map.keySet()) {
            System.out.println(key + ": " + map.get(key));
        }
        // 출력:
        // Alice: 25
        // Charlie: 35
    }
}

 

제네릭스

- 자료형을 명시적으로 지정

- 제한적일 수 있지만 안정성을 높여주고 형변환을 줄여준다.

- ArrayList<String> list = new ArrayList<String>();

 

타입 변환

- 서로 다른 타입 간의 연산을 수행하는 경우, 연산 수행 전 두 타입을 일치시켜야 하는데 변수나 리터럴의 타입을 변환하는 작업을 타입 변환 혹은 형 변환이라고 함

- 문자열(String) 타입도 기본 타입으로 변경 가능

 

자동 형 변환

- 경우에 따라 소스 코드상에서 형 변환을 안해도 컴파일러가 형 변환을 추가해주는 경우가 있음(자동 형 변환)

- 표현 범위가 좁은 범위에서 넓은 범위로 저장될 때, 자동 형 변환이 됨

byte < short < int < long < float < double

- 표현 범위가 넓은 범위에서 좁은 범위로 저장될 땐, 에러를 발생시킴

더 작은 범위로 할당되면서 값 손실이 일어날 수 있기 때문

명시적으로 형 변환을 해줄 시, 에러를 발생시키지 않음