본문 바로가기

JAVA

[ 김영한의 자바 입문 ] 섹션 2. 변수

 

이 포스트는 인프런 "김영한의 자바 입문" 섹션 2 강의를 바탕으로 작성하였습니다 :) 

https://inf.run/2zsZz

 

[지금 무료] 김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음 강의 - 인프런

프로그래밍에 처음 입문하는 분들을 위한 자바 강의입니다. 코드를 따라하면서 손쉽게 자바를 배울 수 있습니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 자바 입문[사진][임베

www.inflearn.com

 


 

01. 변수 시작

 

 

# Var1

package variable;

public class Var1 {
    public static void main(String[] args) {
        System.out.println(10);
        System.out.println(10);
        System.out.println(10);
        System.out.println(10);
    }
}

 

10
10
10
10

 

 

 

ㅇ 패키지 (packages)

- variable 이라는 패키지를 만들었다면, 해당 패키지에 들어가는 자바 파일 첫 줄에 packages variable; 와 같이 소속된 패키지를 선언해주어야 함

- 자바 파일이 위치하는 패키지와 package variable 선언 위치가 같아야 함

 

자바 파일이 위치하는 패키지와 패키지 선언 위치가 같아야함

 

 

** 단축키 정보
psvm -> public static void main(String[] args)
sout -> System.out.println();

 

자동으로 출력되는 것을 알 수 있다.

알차게 잘 써먹을 예정입니다 ^___^

 

 

 

 

 

# Var2

- 10이 아닌 20으로 숫자를 변경하여 출력하고 싶을 때

- 사용자가 숫자를 입력하고, 출력하고 싶을 때

 

우리는 이때 "변수"라는 기능을 사용하여 프로그램 코드를 작성한다.

 

 

 

case 1. 10을 변수로 선언

package variable;

public class Var2 {
    public static void main(String[] args) {
        int a; //변수 선수
        a = 10; //변수 초기화

        System.out.println(a);
        System.out.println(a);
        System.out.println(a);
    }
}

 

10
10
10

 

 

case 2. 20을 변수로 선언

package variable;

public class Var2 {
    public static void main(String[] args) {
        int a; //변수 선수
        a = 20; //변수 초기화

        System.out.println(a);
        System.out.println(a);
        System.out.println(a);
    }
}

 

20

20

20

 

>> a의 값을 변경하면 출력결과가 모두 함께 변경되는 것을 확인할 수 있다.

 

 

 

 

 

 

 

02. 변수 값 변경

 

 

# Var3

package variable;

public class Var3 {
    public static void main(String[] args) {
        int a; // 변수 선언
        a=10;  // 변수 초기화 a(10)
        System.out.println(a);
        a=50; // 변수 값 변경 : a(10->50)
        System.out.println(a);
    }
}

 

10

50

 

 

* 출력 과정

1. a=10; -> 변수 a에 10을 저장한다.
2. System.out.println(a); -> 변수 a의 값을 읽는다. a에는 10이 들어있다. 10을 출력한다.
3. a=50; -> 변수 a의 값을 50으로 변경한다. a(10->50)
4. System.out.println(a); -> 변수 a의 값을 읽는다. a에는 50이 들어있다. 50을 출력한다.

 

 

 

 

 

 

03. 변수 선언과 초기화

 

 

ㅇ 변수 선언

변수를 선언하면 컴퓨터의 메모리 공간을 확보해서 그곳에 데이터를 저장할 수 있다.

그리고 변수의 이름을 통해서 해당 메모리 공간에 접근할 수 있다.

쉽게 이야기해서 데이터를 보관할 수 있는 공간을 만들고, 그곳에 이름을 부여한다.

 

 

# Var4

package variable;

public class Var4 {
    public static void main(String[] args) {
        int a;
        int b;

        int c,d;
        
    }
}

 

변수는 다음과 같이 하나씩 선언할 수도 있고

int a;
int b;

 

다음과 같이 한번에 여러 변수를 선언할 수도 있다.

int c,d;

 

 

 

 

 

ㅇ 변수 초기화

변수를 선언하고, 선언한 변수에 처음으로 값을 저장하는 것을 "변수 초기화"라고 한다.

 

# Var5

package variable;

public class Var5 {
    public static void main(String[] args) {
        //1. 변수 선언, 초기화 각각 따로
        int a;
        a=1;
        System.out.println(a);

        int b=2; //2.변수 선언과 초기화를 한번에
        System.out.println(b);

        int c=3, d=4; //3. 여러 변수 선언과 초기화를 한번에
        System.out.println(c);
        System.out.println(d);
    }
}

 

1

2

3

4

 

 

 

* 출력 과정

1. 변수의 선언과 초기화를 각각 따로 할 수 있다.
2. 변수를 선언하면서 동시에 초기화 할 수 있다. 
    ->  int b 를 사용해서 변수 b를 만들고 그 다음에 바로 b=2 를 사용해서 변수 b에 값 2 저장
3. 여러 변수를 선언하면서 초기화도 동시에 진행할 수 있다.

 

** 단축키 정보
Ctrl + Shift + F10  -> 코드 출력 실행 단축키 (Windows)

 

 

 

 

 

 

ㅇ 변수는 초기화 해야한다

만약 변수를 초기화 하지 않고 사용하면 어떻게 될까?

 

# Var6

package variable;

public class Var6 {
    public static void main(String[] args) {
        int a;
        System.out.println(a);
    }
}

 

 

변수를 초기화 하지 않고 사용하면 위에 사진과 같이 컴파일 에러가 발생한다.

 

 

 

 

 

왜 이런 오류가 발생할까?

 

컴퓨터에서 메모리는 여러 시스템이 함께 사용하는 공간이다. 그래서 어떠한 값들이 계속 저장된다.

변수를 선언하면 메모리상의 어떤 공간을 차지하고 사용하는데,

초기화 하지 않으면 그 공간에 기존에 어떤 값이 있었는지 아무도 모르고 이상한 값이 출력될 수 있다.

이러한 문제를 예방하기 위해 자바는 변수를 초기화 하도록 "강제"한다.

 

 

cf 1 . 지역변수

지금 학습하는 변수는 "지역변수 (Local Variable)이라고 하는데, 지역 변수는 개발자가 직접 초기화를 해주어야 한다.

나중에 배울 클래스 변수와 인스턴스 변수는 자바가 자동으로 초기화를 진행해준다.

 

cf 2 . 컴파일 에러

컴파일 에러는 자바 문법에 맞지 않았을 때 발생하는 에러이다.

오류를 빨리, 그리고 명확하게 찾을 수 있기 때문에 사실은 좋은 에러다. 덕분에 빠르게 버그를 찾아서 고칠 수 있다.

 

out 에서도 var6이 없는 것을 확인할 수 있음

 

package variable;

public class Var6 {
    public static void main(String[] args) {
        int a;
        //System.out.println(a);
    }
}

 

System.out.println(a); 부분을 위와 같이 주석 처리해준다면,

out에서 var6 파일이 생성되는 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

04. 변수 타입 1

 

변수는 데이터를 다루는 종류에 따라 다양한 형식이 존재한다.

 

# Var7

package variable;


public class Var7 {
    public static void main(String[] args) {
        int a=100; //정수
        double b=10.5; //실수
        boolean c=true; //불리언(boolean) true, false 입력 가능
        char d='A'; //문자 하나
        String e="Hello Java"; //문자열, 문자열을 다루기 위한 특별한 타입

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
        System.out.println(e);
    }
}

 

100
10.5
true
A
Hello Java

 

 

변수는 데이터를 다루는 종류에 따라 다양한 형식이 존재한다.

이러한 형식을 영어로는 타입(type)이라고 하고, 우리말로는 형식 또는 형이라고 한다.

예를 들어서 int 타입, int 형식, int 형 등으로 부른다.

특별히 구분하지 않고 섞어서 부르기 때문에 모두 같은 말로 이해하면 된다.

 

 

 

ㅇ 변수 타입의 예

- int : 정수를 다룬다    (ex) 1, 100, 1000
- double : 실수를 다룬다   (ex) 0.2, 1.5, 100.121
- boolean : 불리언 타입이라 한다. true, false 값만 사용할 수 있다.
                   주로 참과 거짓을 판단하는 곳에서 사용한다.
- char : 문자 하나를 다룰 때 사용한다. 작은 따옴표(')를 사용해서 감싸야 한다    (ex) 'A', '가'
- String : 문자열을 다룬다. 큰 따옴표를 사용해야 한다.  (ex) "Hello Java"

 

 

파이썬 변수 타입과 미치게 헷갈린다..

str은 비슷하지만 ,, double이 왜이리 생각 안나는지 모르겠다 ,,,

 

 

cf . String

String은 첫 글자가 대문자로 시작하는 특별한 타입이다.

 

 

 

 

 

 

ㅇ 리터럴

코드에서 개발자가 직접 적은 100, 10.5, true, 'A', "Hello Java"와 같은

"고정된 값"을 프로그래밍 용어로 리터럴(literal)이라고 한다.

 

변수의 값은 변할 수 있지만, 리터럴은 개발자가 직접 입력한 고정된 값이다.

따라서 리터럴 자체는 변하지 않는다.

int a=100;  // 정수 리터럴
double b=10.5; // 실수 리터럴
boolean c=true; // 불리언 리터럴
char d='A' // 문자 하나 리터럴
String e="Hello Java" // 문자열 리터럴

 

 

 

 

 

 

 

 

 

05. 변수 타입 2

 

 

ㅇ 숫자 타입

# Var8

package variable;

public class Var8 {
    public static void main(String[] args) {
        // 정수
        byte b =127; // -128 ~ 127까지
        short s = 32767; // -32,768 ~ 32,767
        int i = 2147483647; //-2,147,483,648 ~ 2,147,483,647 (약 20억)

        // -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
        long l=9223372036854775807L;

        // 실수
        float f = 10.0f;
        double d = 10.0;
    }

 

메모리를 작게 사용하면 작은 숫자를 표현할 수 있고, 메모리를 많이 사용하면 큰 숫자를 표현할 수 있다.

변수를 선언하면 표현 범위에 따라 메모리 공간을 차지한다.

그래서 필요에 맞도록 다양한 타입을 제공한다.

 

 

 

표현할 수 있는 숫자의 범위와 차지하는 메모리 공간은 다음과 같다.

 

 

- 정수형

byte : -127 ~ 127 (1byte, 2^8)
short : -32,768 ~ 32,767 (2byte, 2^16)
int : -2,147,483,648 ~ 2,147,483,647 (약 20억) (4byte, 2^32)
long : -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (8byte, 2^64)

 

 

- 실수형

float : 대략 -3.4E38 ~ 3.4E38, 7자리 정밀도 (4byte, 2^32)
double : 대략 -1.7E308 ~ 1.7E308, 15자리 정밀도 (8byte, 2^64)

 

 

- 기타

boolean : true, false (1byte)
char : 문자 하나 (1byte)
String : 문자열을 표현한다. 메모리 사용량은 문자 길이에 따라 동적으로 달라진다.

 

 

 

 

 

ㅇ 리터럴 타입 지정

 

정수 리터럴int를 기본적으로 사용한다. 따라서 int 범위까지 표현할 수 있다.

숫자가 int 범위인 약 20억을 넘어가면 L을 붙여서 정수 리터럴을 long으로 변경해야 한다.

(대문자 L, 소문자 l 모두 가능하다. 그런데 소문자 l은 숫자 1과 착각할 수 있어서 권장하지 않는다.)

 

실수 리터럴은 기본이 double형을 사용한다.

float형을 사용하려면 f를 붙여서 float형으로 지정해야 한다.

 

 

 

ㅇ 변수 타입 정리

이렇게 많은 변수들을 실제로 다 외우고 사용해야 할까?

 

다음 타입은 실무에서 거의 사용하지 않는다.

 

 

 

 

06. 변수 명명 규칙

 

 

 

cf. 낙타표기법

프로그래밍에서 변수,함수,클래스 등의 이름을 지을 때 많이 사용하는 표기법 중 하나이다.

이 표기법의 이름은 이름이 여러 단어로 구성되어 있을 때,

각 단어의 첫 글자가 대문자로 시작하고,이 대문자들이 낙타의 동봉처럼 보이는 것에서 유래했다.

이름에 공백을 넣지 않고도 여러 단어를 쉽게 구분할 수 있으므로, 변수의 이름을 이해하기 쉽게 만들어준다.

 

 

 

 

 

 

06. 문제와 풀이

 

 

백문이 불여일타 !

 

프로그래밍은 수영이나 자전거 타기와 비슷하다.
아무리 책을 보고 강의 영상을 봐도 직접 물속에 들어가거나 자전거를 타봐야 이해할 수 있다.

프로그래밍도 마찬가지다.
이해하고 외우는 것도 중요하지만 무엇보다 직접 코딩을 해보는 것이 더욱 중요하다.
읽어서 이해가 잘 안 되더라도 직접 코딩을 해보면 자연스럽게 이해가 되는 경우도 많다.
백번 읽는 것보다 한 번 직접 코딩해서 결과를 보는 것이 좋은 개발자로 빠르게 성장할 수 있는 지름길이다.

 

 

 

 

 

 

 

문제 1

다음 코드에 반복해서 나오는 숫자 4,3을 다른 숫자로 한번에 변경할 수 있도록

다음을 변수 num1, num2를 사용하도록 변경해보세요.

 

# VarEx1

package variable.ex;

public class VarEx1 {
    public static void main(String[] args) {
        int num1=4;
        int num2=3;
        System.out.println(num1+num2);
        System.out.println(num1-num2);
        System.out.println(num1*num2);
    }
}

 

7
1
12

 

 

 

문제 2

다음과 같은 작업을 수행하는 프로그램을 작성하세요.

클래스 이름은 VarEx2라고 적어주세요.

 

1. 변수 num1을 선언하고, 이에 10을 할당하세요.

2. 변수 num 2를 선언하고, 이에 20을 할당하세요.

3. 두 변수의 합을 구하고, 그 결과를 새로운 변수 sum에 저장하세요.

4. sum 변수의 값을 출력하세요.

 

# VarEx2

package variable.ex;

public class VarEx2 {
    public static void main(String[] args) {
        int num1=10;
        int num2=20;
        int sum;
        sum=num1+num2;

        System.out.println(sum);
    }
}

 

30

 

 

# 정답코드

package variable.ex;

public class VarEx2 {
    public static void main(String[] args) {
        int num1=10;
        int num2=20;
        int sum=num1+num2;

        System.out.println(sum);
    }
}

 

30

 

 

int sum=num1+num2; 로 간단하게 표현할 수 있었다는 것을 알아갑니다..

 

 

intellij 사용하지 않고 손코딩을 했더라면, 저는 이 문제 틀렸습니다.

sum 변수 선언할 때 데이터 타입 안 적고 바로 sum=num1+num2;를 적었거든요..

 

 

그리고 변수 선언할 때, 파이썬과 자바의 차이점에 대해서 물어봤습니다..

기억 상 파이썬 변수 선언할 땐 데이터 타입을 명시적으로 지정하지 않았거든요.

사람들이 여러모로 파이썬이 간편하다고 하는데는 이유가 있었네요 ^^;;

https://chat.openai.com/share/2b4c74ca-ecb9-44a7-a371-dec4eb3ec236

 

ChatGPT

A conversational AI system that listens, learns, and challenges

chat.openai.com

 

 

 

 

 

파이썬과 자바의 차이점을 정리해보자면

 

자바는 다음과 같이 'int'라는 정수형 데이터 타입을 명시하며 변수를 선언하지만,

int myNumber = 10;

 

파이썬은 변수의 데이터 타입이 자동으로 결정되기 때문에, 따로 데이터 타입을 명시적으로 지정하지 않는다.

my_number = 10

 

 그리고 데이터 타입이 자동으로 결정되기에 같은 변수에 다른 데이터 타입을 할당할 수 있다.

my_number = 10
my_number = "Hello"

 

 

 

여기서 더 궁금해서 찾아보았던 자바의 변수 선언 특징은

 

pasreInt()는 javascript 에서만 있는 줄 알았는데, java에서도 사용되는 함수라는 사실 ! ...

나중에 알게 될 사실이었겠지만 그래도 gpt한테 물어보면서 신기한 것을 알아간다 ~ ,,,

 

 

 

 

문제 3 - long, boolean 데이터 타입

클래스 이름 : VarEx3

long 타입의 변수를 선언하고, 그 변수를 10000000000(백억)으로 초기화한 후 출력하는 프로그램을 작성하세요.

boolean 타입의 변수를 선언하고, 그 변수를 true로 초기화한 후 출력하는 프로그램을 작성하세요.

 

# VarEx3

package variable.ex;

public class VarEx3 {
    public static void main(String[] args) {
        long a = 1000000000L;
        boolean b = true;
        System.out.println(a);
        System.out.println(b);
    }
}

 

1000000000
true

** 단축키 정보
soutv()
System.out.println("b = " + b); 와 같이 자동적으로 생성됨