본문 바로가기
✏️Java 공부/Java의 정석

[Java 공부/ Java의 정석] Chapter 01. 자바를 시작하기 전에 & Chapter 02 : 변수

by 코코의 주인 2022. 1. 22.

스프링 공부를 위해 자바를 시작해보려고 한다.

학교 다니면서 자바를 배울 일이 있었지만, 내가 열정적으로 배우지 않았다.

안드로이드 앱 개발도 했는데 자바를 1도 모른다. 프로젝트는 대체 어떻게 한건지 모르겠다??

주말 동안 자료형, 입출력, 반복문, 조건문 까지 한 번 훑어보려 한다.

교재로 사용할 책은 남궁성 님의 "자바의 정석"이다. 남궁씨가 별로 흔한 성씨가 아닐텐데 유명한 사람 중에 많이 보이는 것으로  보면 유전자가 좀 뭐가 있나??

사실 한 가지 프로그래밍 언어를 확실하게 안다면 다른 언어를 새로 배우는 것은 쉽다고 생각한다. 난 전공자니까!!

하지만 내가 객체지향의 개념은 제대로 모르기 때문에 교재를 고르면서 제일 신경 쓴 것이 이 부분을 잘 설명해둔 책을 고르는 것이었다.

인터넷에 검색을 해보니 객체지향이 뭔지 설명이 잘 되어있다고 평이 좋아서 골랐다. 인터넷에서 내 돈 주고 샀다..

글은 전체적으로 C/C++ 이랑 Java가 어떤 차이가 있는지 비교하면서 배우는 형식으로 진행될 거 같다.


Hello, Java

public class Main {

    public static void main(String[] args) {
	System.out.println("Hello, Java");
    }
}

모든 프로그래밍 언어 교재의 첫 스타트는 "Hello World"를 찍는 것으로 시작한다. 나도 일단 "Hello, Java" 먼저 찍고 시작하겠다.

대학 와서 C언어 처음 배울 때 생각나고 새롭다!!


변수

변수의 선언과 초기화

변수는 선언과 초기화는 C++이랑 큰 차이는 없어보인다.

int num = 10;  //int형 변수 num을 선언하고 10으로 초기화
int num2;
num2 = num +10;  //num2 = 20

변수의 타입

기본형과 참조형

자바의 자료형은 '기본형'과 '참조형'으로 나눌 수 있다.

참조형의 경우 C계열에서 쓰는 포인터와 비슷한 개념 같지만 연산을 할 수 없다는 차이가 있다.

  • 기본형 : 실제 값(data)을 저장
  • 참조형 : 어떤 값이 저장되어 있는 주소(memory address)를 저장

기본형

분류 역할 타입 (괄호 안은 byte)
논리형 True와 False 를 값으로 가짐 boolean(1)
문자형 문자를 저장 char(2)
정수형 정수를 저장 byte(1), short(2), int(4), long(8)
실수형 실수를 저장 float(4), double(8)
  • C++ 과 달리 자바는 유니코드 문제체계를 사용하기 때문에 char의 크기가 2byte임
  • 정수형에 -128~127의 범위를 가지는 byte가 있음

정도만 알고 넘어가면 될 거 같다.


상수와 리터럴

final int MAX_SPEED = 10;	//상수 MAX_SPEED를 선언하고 10으로 초기화
MAX_SPEED = 200;	//에러, 상수의 값을 변경하려고 하면 오류가 남
final int MAX_VALUE;	//에러, 상수는 선언과 동시에 초기화 해야함

C++에서 const나 전처리문에 #define으로 기호상수를 선언해서 사용하는 것과 비슷한 개념처럼 보인다.

자바에서 상수를 선언하려면 변수의 타입 앞에 'final을 붙여주면 된다.

리터럴은 상수나 변수에 들어가는 값을 의미한다.

위의 예제를 보면 'MAX_SPEED'는 상수가 되고, '10'은 리터럴이 된다.


형식화된 출력 - printf()

int age = 10;
System.out.printf("age : %d", age);

'println()'의 경우 변수의 값을 그대로 출력하기 때문에 출력 형식을 변경할 수 없다.

예를 들어, 소수점 자리를 제한하여 출력하거나, 정수를 16진수나 8진수로 출력할 수 없다는 뜻이다.

이 경우 'printf()'를 사용해야 한다.

지시자의 경우 C++ 이랑 차이가 없어서 넘어가도록 하겠다.

 

정수형

int age = 25;

//age = 25
System.out.printf("age : %d", age);    

//age = [___25], 5자리를 잡아두고 우측 정령
System.out.printf("age : [%5d]", age); 

//age = [25___], 5자리를 잡아두고 좌측 정렬
System.out.printf("age : [%-5d]", age);  

//age = [00025] , 5자리를 잡아두고 우측 정렬 + 남은 자리는 0으로 채우기
System.out.printf("age : [%05d]", age);

실수형

double pi = 3.14159265359;

//pi = 3.141593 , 소수점 7자리에서 반올림해서 6자리까지 출력
System.out.printf("pi = %f", pi);	

//pi = [3.1415926536____] , 14자리의 공간을 잡아두고 10자리까지 출력(11자리에서 반올림)
System.out.printf("pi = [%14.10f]", pi);	

//pi = [3.1415926535900_] , 14자리의 공간을 잡아두고 13자리까지 출력(남는 자리는 0으로 채움)
System.out.printf("pi = [%14.13f]", pi);

문자열

String str = "일이삼사오육칠팔구십";

//str = 일이삼사오육칠팔구십
System.out.printf("str = %s" , str);

//str = [_____일이삼사오육칠팔구십] , 15자리를 잡아두고 우측정렬
System.out.printf("str = [%15s]" , str);

//str = [일이삼사오육칠팔구십____] , 15자리를 잡아두고 좌측 정렬
System.out.printf("str = [%-15s]" , str);

//str = [_______일이삼사오육칠팔] , 15자리를 잡아두고 8자리만 좌측정렬
System.out.printf("str = [%15.8s]" , str);

화면에서 입력받기 - Scanner

import java.util.*;  //패키지 추가

public class Main {

    public static void main(String[] args) {
    
        Scanner scanner = new Scanner(System.in);  //Scanner클래스 객체 추가
        
        String input = scanner.nextLine();  //input에 문자열 입력 받음
        int num = Integer.parseInt(input);  //문자열을 정수형으로 변환

        System.out.println("입력내용 : " + input);  //입력내용 : 22
        System.out.println("num : " + num);  //num : 22
    }
}

입력 하나 받는데 이렇게 뭐가 많냐...

nextLine()메서드를 사용하면 입력을 문자열로 입력받기 때문에 연산을 위해서는 정수형으로 변환을 해줘야한다.

//정수형 입력
int num1 = scanner.nextInt();

//실수형 입력
float num2 = scanner.nextFloat();

하지만 늘 그렇게 하기 귀찮으니 nextInt() 메서드와 nextFloat() 메서드를 이용해주도록 하자.


파이썬에서도 비슷한 게 있었던 거 같다.

// 생각나서 써보는 Python

a = input("문자열로 입력")
b = int(input("문자열로 입력받는 것을 정수로 변환"))

총평

여기까지 자바의 자료형과 입출력 방법에 대해 알아봤다.

C++이랑 많이 다른 게 없어서 수월했던 거 같다.

댓글