반응형

# 형 변환(캐스팅, casting)

  • 변수나 리터럴의 타입을 다른 타입으로 변환하는 것.

## 형 변환 방법

(타입)피연산자

=> double 타입의 변수를 int 타입으로 변환하는 예.
double d = 85.7;
int score = (int)d;
  • 형 변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙임.
  • 형 변환에서 사용되는 괄호를 캐스트 연산자 or 형변환 연산자라고 한다. (형 변환 = 캐스팅)
  • 형 변환 연산자 : 단순히 피연산자의 값을 읽어 지정된 타입으로 형 변환, 해당 결과를 반환. (피연산자의 변수 값은 형변환 후에도 아무런 변화가 없음)
  • 기본형에서 boolean 타입을 제외한 나머지 타입들은 서로 형변환이 가능하다. (기본형과 참조형 간의 형 변환은 불가능)
변환 수식 결과
int > char (char) 65 'A'
char > int (int) 'A' 65
float > int (int) 1.6f 1
int > float (float) 10 10.0f
  • float 타입 int 변환 시 소수점 이하 값 '버림 처리'

 

1. 정수형 값 형 변환

  • 큰 타입 > 작은 타입으로 변환 시, 경우에 따라 '값 손실(loss of data)' 발생 가능. (저장 공간의 부족으로 발생)
  • 작은 타입 > 큰 타입으로 변환 시, 값 손실 없음. (나머지 빈 공간은 0 or 1로 채워진다. -> 보통 0으로 채우는 게 보통이지만, 값이 음수인 경우 1로 채운다. 이는 형 변환 후에도 부호를 유지할 수 있도록 하기 위함이다.)
1. int > byte
i = 10 > b = 10

2. int > byte
i = 300 > b = 44

3. byte > int
b = 10 > i = 10

4. byte > int
b = -2 > i = -2

5. Integer.toBinaryString(int i)
i = 11111111111111111111111111111110

 

2. 실수형 간 형 변환

  • 작은 타입 > 큰 타입 변환 시, 빈 공간을 0으로 채움

 

3. 정수형과 실수형 간의 형 변환

  • 정수형을 실수형으로 변환 시, 정수는 소수점 이하의 값이 없으므로 비교적 변환이 간단. (정수를 2진수로 변환 후 정규화를 거쳐 실수의 저장형식으로 저장)
  • 실수형은 정수형 보다 큰 저장범위를 갖기 때문에 무리가 없지만, 실수형의 정밀도의 제한으로 오차가 발생할 수 있다.
  • 실수형을 정수형으로 변환 시, 실수형의 소수점 이하 값은 버려진다. (정수형의 표현 형식으로는 소수점 이하의 값을 표현할 수 없기 때문) 만약 실수의 소수점을 버리고 남은 정수가 정수형의 저장범위를 넘는 경우에는 정수의 오버플로우가 발생한 결과를 얻는다.

 

4. 자동 형 변환

  • 서로 다른 타입간의 대입 or 연산 시 형 변환으로 타입을 일치시키는 것이 원칙이나, 경우에 따라 편의상의 이유로 형 변환 생략 가능. 이때 컴파일러가 생략된 형변환을 자동적으로 추가한다.
  • 컴파일러는 '기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환 한다.'
  • 표현 범위가 좁은 타입 > 넓은 타입으로 형 변환하는 경우 값 손실이 없으므로 표현 범위가 넓은 쪽으로 형변환 된다.
  • 보통 자료형의 크기가 큰 것일수록 값의 표현범위가 크지만, 실수형은 정수형과 값을 표현하는 방식이 달라 같은 크기라도 실수형이 정수형보다 더 큰 표현 범위를 갖는다.

기본형 자동 형변환 가능한 방향

## 정리

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

# 자바_자주 발생하는 에러와 해결 방법

1. cannot find symbol  / cannot resolver symbol

  • 지정된 변수, 메서드를 찾을 수 없다는 뜻
  • 선언되지 않은 변수 또는 메서드를 사용하거나, 변수 또는 메서드의 이름을 잘못 사용한 경우 발생.
  • 자바에서는 대소문자를 구분하므로 철자 뿐만 아니라 대소문자 일치여부도 확인 필요.

2. ';' expected (세미콜론)

  • 세미콜론이 필요한 곳에 없다는 뜻
  • 자바에서는 모든 문장의 끝에 세미콜론을 붙여줘야 한다.

3. Exception int thread "main" java.lang.NoSuchMethodError:main

  • main 메서드를 찾을 수 없다는 뜻
  • 클래스 내에 main 메서드가 존재하지 않거나 선언부(public static void main(String[] args))에 오타가 존재할 경우 발생
  • 클래스에 main 메서드가 정의되어있는지 확인, 정의되어 있다면 main 메서드의 선언부에 오타가 없는지 확인, 대소문자 일치여부도 확인 필요.

4. Exception in thread "main" java.lang.NoClassDefFoundError:Hello

  • Hello 라는 클래스를 찾을 수 없다는 뜻
  • Hello의 철자, 대소문자 등을 확인, 이상이 없다면 클래스 파일(*.class)이 생성되었는지 확인 필요
  • (Hello.java가 정상적으로 컴파일 된 경우 Hello.class가 있어야 함 / 클래스파일이 존재하는데 동일한 메시지가 반복될 경우 클래스패스(classpath)의 설정이 바르게 되었는지 확인 필요)

5. illegal start of expression

  • 문장(또는 수식)의 앞부분이 문법에 맞지 않다는 뜻
  • 문법적 오류가 있다는 것으로, 괄호( '(', '{' ) 등을 열고서 닫지 않았거나, 수식이나 if문, for문 등에 문법적 오류가 존재하는 경우 또는 public, static 등의 키워드를 잘못 사용한 경우 발생
  • 에러가 발생된 부분이 문법적으로 올바른지 확인 필요

6. class, interface, or enum expected

  • 키워드 class나 interface 또는 enum이 없다는 뜻 (보통 괄호 ('{' 또는 '}')의 개수가 일치 하지 않는 경우 발생)
  • 열린괄호와 닫힌괄호의 개수가 같은지 확인 필요
반응형

'프로그래밍 > 자바, JDBC' 카테고리의 다른 글

연산자와 피 연산자  (0) 2021.09.27
형 변환(캐스팅, casting)  (0) 2021.09.27
자바 scanner 관련 명령어  (0) 2020.10.21
자바 BufferedReader, BufferedWriter  (0) 2020.10.20
스프링 부트 스케줄러 적용방법  (0) 2020.09.29
반응형

# 자바 scanner 관련 명령어

Scanner scanner = new Scanner(System.in);

sc.next() : 다음 토큰을 읽는다.

sc.nextLine : 다음 행을 읽는다.

sc.hasNext : 토큰이 있는지 확인하고 boolean을 리턴, 공백의 경우 무시한다.

sc.hasNextLine : 행이 있는지 확인 후 boolean을 리턴, 줄 바뀜이 있으면 true를 리턴한다.
반응형
반응형

# BufferedReader / BufferedWriter

## BufferedReader 

  • 버퍼를 이용하여 읽고 쓰는 함수, 버퍼를 이용하기 때문에 입출력의 효율이 좋아진다.
  • Scanner의 경우 띄어쓰기와 엔터를 경계로 인식하기 때문에 따로 가공 할 필요가 없어 사용이 편리하다.
  • BufferedReader의 경우 엔터만 경계로 인식, 입력받은 데이터가 모두 String으로 고정되지만, Scanner에 비해 빠르다.
1. 콘솔로 입력 받는 경우
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

String s = bf.readLine(); //String

int i = Integer.parseInt(bf.readLine()); //Int 

bf.close();


2. 파일로 입력받는 경우
FileReader file = new FileReader("파일명.java");
BufferedReader bf = new BufferedReader(file);

 

## BufferedWriter

  • BufferedWriter은 System.out.print("")과 동일하게 사용 가능한 함수이다.
BufferedWriter bf = new BufferedWriter(new FileWriter("BufferedWriter.txt"));


1. 출력
bf.write("출력할 내용");


2. 개행 ( newLine() or \n )
bf.newLine();
bf.write("출력내용\n");


3. 남은 데이터 모두 출력
bf.flush();


4. 스트림
bf.close();

 

## 사용 예제

import java.io.*;

class Main {
  public static void main(String[] args) throws IOException {

    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    int num = Integer.parseInt(bf.readLine());

    for ( int i = 0; i < num; i++ ) {
      String temp = bf.readLine();
      String[] arr = temp.split(" ");
      int a = Integer.parseInt(arr[0]);
      int b = Integer.parseInt(arr[1]);
      bw.write((a+b) + "\n");
    }
    
    bw.flush();
    bw.close();

  }
}
반응형

+ Recent posts