JAVA - 1

Chris Kim·2025년 1월 20일

프로그래밍언어

목록 보기
23/25

1. 서론

본인은 Python을 조금 쓸 줄 알고, C언어는 실제로 사용할 줄 아는정도는 아니고, 예전에 관련 책의 번역하면서 개념을 공부한 정도다.만약 해당 책이 한글로 번역되어 정식 출간된다면 비공개전환 예정(해당글)
Booki라는 가계부 작성 프로젝트를 JAVA를 통해 진행할 예정이기에, 엄청 자세한 내용을 여기에 담지는 않았다. 다시말해 노트 필기를 여기에 작성한 것이라고 이해해주면 된다. 참고한 책은 남궁 성님의 "자바의 정석 3rd Edition"이다.

2. 변수(Variable)

2.1 변수의 타입

2.1.1 출력

자바에서도 파이썬의 print() 처럼 형식화된 출력을 수행할 수 있다. 지시자(specifier)를 활용하면 변수등을 담아서 출력할 수 있다. 다음은 그 예시다.

System.out.printf("finger = [%5d]", finger) // finger = [     10]

지시자 %x, %o 에서 %바로 뒤에 #을 끼워넣으면 접두사 '0x''0o'가 붙는다. 참고로 10진수를 2진수로 변환해주는 지시자는 없다.(Integer.toBinarySString(binNum)을 사용해야한다.)

파이썬에서는 char 형에 지시자 %d를 쓰면 알아서 정수값으로 변환해주었겠지만, 자바에서는 변수 앞에 (int)c 와 같이 캐스팅(casting)을 수행해주어야 한다. 지시자의 종류는 서칭하면 잘 나온다.
파이썬과 마찬가지로 %14.10f는 14자리 중 소수점 아래 10자리라는 뜻이다. 그 밖에 지시자의 활용에 관해서는 파이썬과 거의 유사하다.(공백, 채우기 등등)

2.1.2 입력 - Scanner

자바에서는 Scanner 클래스를 통해 입력을 받을 수 있다. 먼저
import java.util.*;를 추가해주고,
Scanner scanner = new Scanner(System.in);을 통해 Scanner클래스를 생성해준다.

다음은 입력대기 상태에서 입력을 마치고 엔터키를 누르면 입력한 내용이 문자열로 반환되는 코드다.

String input = scanner.nextLine(); // 입력 내용을 input에 저장
int num = Integer.parseInt(input); // 입력 내용을 int로 변환

사실 변환없이 숫자로 입력받는 메서드들이 Scanner클래스 내에 있지만 화면에서 연속적으로 값을 입력받으므로 사용하기에 까다롭다.

2.2 기본형(primitive type)

2.2.1 불린 - boolean

boolean power = true;
boolean checked = False; // false로 바뀌어야 한다. 대소문자 구분이 이뤄진다.

파이썬과의 차이점이라면 첫 글자가 대문자냐 아니냐 정도의 차이다.

2.2.2 문자형 - char

2.2.3 정수형

byte - short - int - long 순으로 1, 2, 4, 8바이트의 크기를 같는 정수형이다. 접미사가 없는 정수의 경우 기본적으로 int로 처리한다.

2.2.4 실수형

float - double 순으로 4, 8바이트의 크기를 가지고 각각 7자리, 15자리의 정밀도를 가지고 있다.

2.3 형변환

(int), (float) 과 같은 형태로 변수 또는 상수의 타입(type)을 다른 타입으로 변환할 수 있다. 다만 이 경우, 자료형의 크기 차이로 인한 loss of data가 발생할 수 있다.
자바는 아니지만 형변환에 관한 insight를 다룬 이 있다. 자세한 원리가 적혀있지는 않지만 해당 글의 키워드를 구글링한다면 형변환에 관한 다양한 내용을 찾을 수 있을 것이다.

  1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
  2. 기본형과 참조형은 서로 형변환할 수 없다.
  3. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.

3. 연산자(Operator)

C와 연산자의 활용이 거의 비슷하다.물론 찾아보면 사소한 부분에서 다른게 잔뜩 있는거 같다. GPT에게 물어본 대표적인 차이점은 다음과 같다.

4. 제어문

4.1 조건문

여기를 참고하자.

4.2 반복문

for, while, do-while문이 있다. 기본적인 개념은 여기를 참고하자.

향상된 for문

int[] arr = {10, 20, 30, 40, 50};

for(int tmp : arr){
	System.out.println(tmp); // 10 20 30 40 50
}

이름 붙은 반복문

Loop1 : for(int i=2;i <=9;i++){
	for(int j=1;j <=9;j++){
    	if(j==5)
        	break Loop1;
        ...
    }
    ...
}

5. 배열(Array)

5.1 배열의 선언과 생성

타입[] 변수이름; // 배열을 다루기 위한 참조변수 선언 '[]`는 변수이름 뒤에 붙여도 된다.
변수이름 = new 타입[길이];
타입[] 변수이름 = new 타입[길이] // 선언과 생성을 동시에

5.2 배열의 길이

배열의 길이는 변수이름.length다. 이는 상수이므로 변경이 불가능하다. 배열의 길이를 변경하는 방법은 더 큰 배열을 새로 생성하고, 기존 배열의 내용을 새로운 배열에 복사하는 것이다.

5.3 배열의 초기화

int[] score = new int[]{50, 60, 70, 80, 90}; // 잘 보면 길이정보를 생략하고 선언, 생성, 초기화까지 할 수 있다.

int add(int[] arr){ /*내용 생략*/}

int result = add(new int[]{50, 60, 70, 80, 90}); //new int[]는 생략할 수 없다.

5.4 배열의 출력

  • Arrays.toStrint(배열이름)은 배열의 모든 요소를 [요소, 요소, 요소, ..., 요소] 형태의 문자열로 변환해주는 메서드다.
  • 배열이름을 매개변수로 출력 메서드에 전달하면, 타입@주소 형식으로 출력된다. 참고로 char 배열의 경우에는 각 요소가 구분자 없이 그대로 출력된댜.

5.5 배열의 복사

  • (1)임시 배열 tmp를 선언한다. (2) for문을 이용해 요소 하나하나를 tmp 배열에 복사한다. (3) 기존배열=tmp를 통해 기존 배열이 새롭게 생성된 배열의 주소를 참조하도록 한다.
  • System.arraycopy()를 이용하여 배열을 복사한다. 이게 위의 방법보다 더 효율적이다.
    (System.arraycopy(num, 0, newNum, 0, num.length); = num[0]부터 num[num.length]까지 newNum[0]에 붙여넣기 시작함.)

5.6 String 배열

스트링 배열의 선언과 생성, 초기화는 기본형 배열과 다르지 않다.
하지만 String 클래스만이 new 연산자를 생략해서 간단히 표현하는게 가능하다.

String[] name = new String[]{"Kim", "Park", "Yi"};
String[] name = {"Kim", "Park", "Yi"};

이때, name 배열에는 "Kim"이 아니라 "Kim"이 저장된 메모리 주소를 담고 있다. 즉 name은 "Kim", "Park" 등이 위치한 메모리 주소를 담고있는 메모리의(?) 주소를 담고 있는 것이다.(이중으로 참조하는 것임) 이를 객체 배열 이라 한다.

5.7 char배열과 String클래스

  • 사실 String클래스는 char배열에 기능(메서드)를 추가한 것이다.
  • char배열과 String클래스의 중요한 차이점은, String객체는 읽을 수 있을 뿐 내용의 변경이 불가능하다.변경 가능한 문자열은 StringBuffer클래스를 사용하면 된다.

char배열과 String클래스간의 변환 예시는 다음과 같다.

char[] chArr = {'A', 'B', 'C', 'D'};
String str = new String(chArr);
char[] tmp = str.toCharArray(str)
profile
회계+IT=???

0개의 댓글