본문 바로가기

JAVA

Java_1강

  변수

변수는 데이터를 저장하는 공간을 의미한다.

변수를 선언하는 방법은 '[자료형] [변수명];'이며 초기화하는 방법은 '[자료형] [변수명] = [초기값];' 혹은 변수를 선언한 뒤 '[변수명] = [초기값];'으로 따로 시켜줘도 된다.

 

1. 데이터 타입

기본 자료형(primitive type)은 8가지이며, 데이터 크기의 순서는 다음과 같다.

byte < short < int < long < float < double < String

또한 숫자형/문자형/불 3가질 나눌 수 있다.

 

숫자형   정수형 - byte(1), short(2), int(4), long(8)
  실수형 - float(4), double(8)
문자형   char(2)
논리형(boolean)   boolean(1)
참조형(문자열형)   String(크기 제한 없음)

여기서 참조형이란 메모리 상에서 변수의 위치와 데이터의 위치가 다른 상태를 말한다. 통상적으로 변수는 호출 스택 영역에 생성되고, 데이터는 힙 영역에 생성된다. 이때 변수에는 데이터의 위치 정보(주소)가 저장되어 이 위치 정보로 실제 데이터를 참조한다고 해서 참조형이라고 한다.

* 호출 스택 영역 : 함수의 호출 시 지역 변수와 매게 변수가 저장되는 임시 메모리 영역. 이때 스택 영역은 메모리의 높은 주소부터 낮은 주소까지 내려가는(후입선출) 절차 형식으로 할당되며, 함수 호출이 완료되면 스택 영역의 함수 정보들은 소멸된다.

* 힙 영역 : 사용자 프로그래머가 직접 할당/해제하는 메모리 영역. 힙 영역은 메모리의 낮은 주소부터 높은 주소까지 올라가는 절차 형식으로 할당된다.

 

2. 형변환(Type casting)

변수에 저장된 값을 꺼내 새로운 자료형으로 변환하는 것을 형변환이라고 한다. 숫자형과 참조형에서만 처리하며 변수 자체는 변하지 않는다. 여기에는 규칙이 있다.

  • 작은 자료형의 데이터를 큰 자료형의 데이터로 변환할 때는 자동으로 처리 => 자동 형변환, 암시적 형변환, 묵시적 형변환
  • 큰 자료형의 데이터를 작은 자료형의 데이터로 변환할 때는 반드시 형변환 연산자를 사용 => 강제 형변환, 명시적 형변환

형변환 연산하는 방법은 변수에 어떤 것을 대입할 때 원하는 type을 앞에 붙이는 것이다.

ex) int num1 = 3;

      float num2 = 3.33f;

      num2 = (int)num1;

public class TypeCast {
    public static void main(String[] args) {
        byte b = 10;
        int ivalue = b; //자동 형변환

        short sh = (short)ivalue; // 강제 형변환
        System.out.println(sh);

        float pi = 3.14f;
        String str = "" + pi;//문자열이 가장 큰 데이터 타입
        //연산 내부에서 자동으로 형변환이 발생(float->String)

        //연산식에서의 자동 형변환 : 연산 순서에 따라 자동 형변환.
        String rsi3 = 5 + 4 + "";
        System.out.println(rsi3); // 5 + 4 = 9 => 9 + "" = "9"
        
        rsi3 = "" + (5 + 4);
        System.out.println(rsi3); // "" + 9 = "9"
        
        rsi3 = 5 + "" + 4;
        System.out.println(rsi3); // 5 + "" = "5" => "5" + 4 = "54"
        
        // 숫자 -> 문자열 변환 메소드 : String.valueOf(숫자);
        String sss = String.valueOf(5);
        // 형변환은 데이터가 대상 => 변수의 타입은 변경되지 않음

        String numStr = "1000";
        // 정수 문자열 -> 정수
        int numInt = Integer.parseInt(numStr);
        // 실수 문자열 -> 실수
        numStr = "3.14";
        float numFloat = Float.parseFloat(numStr);

        float dres = 5.0f / 3;
        System.out.println(dres);

        int ires = 5 / 3;
        System.out.println("몫 : " + ires);
        int r = 5 % 3;
        System.out.println("나머지 : " + r);
    }
}

  출력과 입력

1. 출력

  • println() : 출력 후 다음 라인으로 커서를 이동
  • print() : 출력 후 현 위치를 유지
  • printf("형식 지정", 변수);
int number1 = 0; // 변수의 선언 및 초기화
number1 = 350; // 임의의 값을 대입

int number2 = number1;
number2 = number1 + 250;

System.out.println(number1);
System.out.print("첫 번째 print 출력.");
System.out.printf("number2의 값은 %d입니다.\n", number2); // number2 = 600
// '\n'은 줄바꿈을 표현하는 특수문자

 

2. 서식 지정자

서식 지정자는 printf문을 사용할 때 변수를 불러주는 용이다. '%'와 조합하여 사용하는 문자로서 총 4가지 종류가 있다.

  • %d : 정수 변수의 값을 출력할 때 사용
  • %f : 실수 변수의 값을 출력할 때 사용
  • %c : 문자 변수의 값을 출력할 때 사용
  • %s : 문자열 변수의 값을 출력할 때 사용

3. 입력

JAVA에서 입력을 하고 싶을 때는 입력 처리 객체인 'Scanner'를 이용해야 한다.

Scanner란 다양한 자료형의 데이터를 키보드로부터 입력받기 위해 사용하는 객체이다. 종류는 다음과 같다.

  • 정수 입력 : nextByte(), nextShort(), nextInt(), nextLong()
  • 실수 입력 : nextFloat(), nextDouble()
  • 논리 입력 : nextBoolean()
  • 문자열 입력 : nextLine(), next()

그러나 여기에는 오류가 있다. 정수, 실수를 입력한 후 문자열 입력용인 nextLine()을 사용하면 문자열을 입력받지 못한다. 남아있는 개행문자(줄을 바꾸는 특수문자 = '\n')가 nextLine()의 처리로 인식되기 때문이다.

 

이에 대한 해결방법은 다음과 같다.

nextLine()을 한 줄로 작성(변수에 대입 X) -> next()를 사용(여러 단어의 문장 입력 X) -> 모든 입력을 nextLIne()으로 함 -> 숫자를 입력받을 경우 wrapper class의 parseXXX 메소드로 변환하여 사용

 

* Wrapper Class란?

자바는 모든 것을 객체(class)로 처리하는 것이 기본이다. 그러나 문제가 되는 것이 바로 기본 자료형인데, 이를 해결하기 위해 자료형에 해당하는 클래스, 즉 자료형을 포함한 클래스를 만들었다. 자료형에 대한 정의와 보조적으로 사용할 수 있는 기능 메소드를 묶어 놓은 클래스라고 할 수 있다.

 

Type Wrapper
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

 

import java.util.Scanner;

public class ScannerTest {
    public static void main(String[] args) {
        //scan 인스턴스 생성
        Scanner scan = new Scanner(System.in);

        // 정수 입력 int 값
        System.out.print("정수 입력 : ");
        int i = scan.nextInt();
        System.out.println("입력받은 정수 값 : " + i);

        // 실수 입력 float 값
        System.out.print("실수 입력 : ");
        float f = scan.nextFloat();
        System.out.println("입력받은 실수 값 : " + f);
        
        // 문자열 입력
        System.out.print("문자열 입력 : ");
        String str = scan.next();
        System.out.println("입력받은 문자열 값 : " + str);

        System.out.print("next() 사용 시 문자열 : ");
        String str2 = scan.next();
        System.out.println("next() : " + str2);
        
        scan.nextLine(); // 개행문자 처리
        
        System.out.print("nextLine() 사용 시 문자열 : ");
        String str3 = scan.nextLine();
        System.out.println("nextLine() : " + str3);
    }
}

 

'JAVA' 카테고리의 다른 글

Java_5강(MVC 패턴 예제)  (0) 2022.09.20
Java_4강  (0) 2022.09.19
Java_3강  (0) 2022.09.18
Java_2강  (0) 2022.09.18
Java_0강(Java 및 IntelliJ 설치)  (0) 2022.09.14