데이터 엔지니어링 과정/java

[16일차] 변수와 타입

오리는짹짹 2023. 1. 12. 23:44
목차
1. 자바 시작하기
2. 변수
3. 기본값
4. 타입 변환

파이썬 과정에 이어 자바를 배우기 시작한 날이다. 난 능히 할 수 있다..! 👊🏻👊🏻

 

1. 자바 시작하기

0. 시작하기 전에

- 사람과 컴퓨터가 대화하기 위해선는 사람의 언어와 기계어(0과 1로 이루어진 이진 코드)의 다리 역할을 하는 프로그래밍 언어가 필요하다. 프로그래밍 언어로 작성된 파일을 소스 파일이라고 부른다.

소스 파일은 컴퓨터가 바로 이해할 수 없기 때문에 컴파일이라는 과정을 통하여 0과 1로 이루어진 기계어 파일로 번역 후 컴퓨터에서 사용한다.

1. 자바 특징

  • 모든 운영체제에서 실행 가능
    ➡ 윈도우에서 개발된 프로그램을 수정하지 않고도 바로 리눅스에서 실행할 수 있음!
  • 객체 지향 프로그래밍 : 객체를 만들고, 그 객체들을 연결하여 더 큰 프로그램을 완성하는 기법
  • 메모리 자동 정리
  • 무료 라이브러리 풍부
    🐰 라이브러리는 근데 파이썬이 더 풍부하지 않나..하는 개인적인 생각

2. 자바 이모저모

(1) 모듈 기술자

module chap01 {
	requires java.se; # JAVA SE가 제공하는 모든 모듈이 필요함
    }

🐰 세미콜론을 끝에 꼭 붙여줘야 해!! 잊지말기!

(2) 주석 사용

구분 주석기호 설명
라인 주석 // ··· //부터 라인 끝까지 주석으로 처리
범위 주석 /* ··· */ /* 와 */ 사이에 있는 내용은 모두 주석 처리
도큐먼트 주석 /** ··· */ /* 와 */ 사이에 있는 내용은 모두 주석 처리
주로 javadoc 명령어로 API 도큐먼트를 생성하는 데 사용

🐰 문자열 안에서 주석을 만들 수 없다!

(3) 실행문과 세미콜론

실행문이란 변수 선언, 값 저장, 메소드 호출에 해당하는 코드를 말한다.

실행문 끝에는 반드시 세미콜론(;)을 붙여서 실행문이 끝났음을 표시해주어야 한다.

그렇지 않으면 컴파일 에러가 발생!

🖍차곡차곡🖍

  • JDK : 자바 개발 도구의 줄임말, 자바로 프로그램을 개발할 수 있는 실행 환경(JVM)과 개발 도구(컴파일러) 등을 제공
    ➡ JDK가 설치되면 기본적으로 C:\Program Files\java 폴더가 생성된다.
  • 자바 컴파일러와 실행 명령어는 JDK 설치 폴더 \bin 폴더에 있다.
    ➡ 다른 경로에서 bin 폴더 안에 있는 명령어를 사용할 수 있도록 하기 위해서 JDK 설치 폴더 안의 bin 폴더를 Path 환경 변수에 등록한다.
  • 환경 변수 : 운영체제가 실행하는 데 필요한 정보를 제공하는 변수
  • 이클립스 : 무료로 사용할 수 있는 오픈 소스 통합 개발 환경
    ➡ 통합개발환경 IDE 제공
    🐰 IDE : 프로젝트 생성, 자동 코드 완성, 디버깅 등 개발에 필요한 여러 가지 기능을 통합적으로 제공해주는 툴 
  • 바이트 코드 파일 : 자바 소스 파일을 javac 명령어로 컴파일한 파일
  • JVM : 자바 가상 기계. 바이트 코드 파일을 운영체제를 위한 완전한 기계어로 번역하고 실행하는 역할을 한다. 
  • 클래스 선언 : 자바 소스 파일은 클래스 선언부와 클래스 블록으로 구성되도록 작성하는 것
  • main() 메소드 : java 명령어로 바이트 코드 파일을 실행하면, 제일 먼저 main() 메소드를 찾아 블록 내부를 실행한다. 그래서 main() 메소드를 프로그램 실행 진입점 이라고 부르기도 한다.
  • 자바 프로그램 개발 순서
    ① 소스 파일(~.java)을 작성한다.
    ② javac 명령어로 컴파일한다.
    ③ java 명령어로 실행한다.
    ④ 실행결과를 확인한다.

 

2. 변수

0. 변수란?

값을 저장할 수 있는 메모리의 특정 번지에 붙이는 이름으로, 자바의 변수는 다양한 타입의 값을 저장할 수 없다.

하나의 변수에 동시에 두 가지 값을 저장할 수 없고, 하나의 값만 저장할 수 있다.

1. 변수 선언

  • 변수에 어떤 타입의 데이터를 저장할 것인지 + 변수 이름이 무엇인지를 결정
int age; // 정수 (int)를 저장할 수 있는 age 변수 선언
double value; // 실수 (double)를 저장할 수 있는 value 변수 선언
  • 변수 이름 규칙
    ① 첫 번째 글자는 문자이거나 $, _ 이어야 하고 숫자로 시작 불가
    ②  문자 수(길이)의 제한 없음
    ③ 첫 문자는 영어 소문자로 하되, 다른 단어가 붙을 경우에는 첫 문자를 대문자로 하여 구분
    ④ 자바 예약어는 사용 불가

2. 값 저장

🐰 자바는 파이썬과 달리 선언과 생성이 구분된다. 따라서 변수를 선언한 후에, 값을 저장해야 한다.

int score; 	// 변수 선언
score = 90; // 값 저장

int score = 90; // 변수 선언과 동시에 변수 초기화 가능

3. 변수 사용

변수는 출력문이나 연산식 내부에서 변수에 저장된 값을 출력하거나 연산할 때 사용한다.

package sec01.exam02;

public class VariableUseExample {

	public static void main(String[] args) {
		int hour = 3;
		int minute = 5;
		System.out.println(hour + "시간 " + minute + "분"); 
		// 변수 hour와 minute 값을 출력: 3시간 5분
		
		int totalMinute = (hour*60) + minute;
		System.out.println("총 " + totalMinute + "분");
	}

}

>>> 3시간 5분
>>> 총 185분
  • 변수는 또 다른 변수에 대입하여 값을 복사할 수 있다.
    ⬇ 두 변수의 값을 교환하는 코드 예시 
package sec01.exam03;

public class VariableExchangeExample {

	public static void main(String[] args) {
		int x = 3;
		int y = 5;
		System.out.println("x: " + x + ", y: "+ y);
		
		int temp = x;
		x = y;
		y = temp;
		System.out.println("x: " + x + ", y: " + y);
	}

}


>>> x: 3, y: 5
>>> x: 5, y: 3

🐰 여기에서 사용된 temp는 새로운 공간이라고 여기면 된다. 앞에서 변수는 하나의 값만 갖고 있을 수 있다고 했다. 따라서, temp를 선언함과 동시에 x의 값인 3을 초기값으로 갖게 하고, x는 y의 값인 5로, y는 temp의 값인 3으로 정의하면서 x와 y의 값을 교환하게 되었다.

4. 변수 사용 범위

변수는 자신이 선언된 위치로부터 자신이 속한 블록 내부에서만 사용할 수 있다.

따라서, 중괄호 {} 블록 내에서 선언된 변수는 해당 중괄호 {} 블록 내에서만 사용이 가능하고 밖에서는 사용할 수 없다.

  • 변수 선언시 주의할 점
    ① 변수가 어떤 범위에서 사용될 것인지 생각한 후, 선언 위치 결정
    ② 메소드 블록 전체에서 사용하고 싶다면, 메소드 블록 첫머리에 선언
    ③ 특정 블록 내부에서만 사용된다면, 해당 블록 내에 선언 
package sec01.exam04;

public class VariableScopeExample {

	public static void main(String[] args) {
		int v1 = 15;
		if (v1>10) {
			int v2;
			v2 = v1-10;
		}
		int v3 = v1 + v2 + 5; // 변수 v2를 사용할 수 없기 때문에 컴파일 에러 발생
	}

}

>>> Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	v2 cannot be resolved to a variable

	at chap01/sec01.exam04.VariableScopeExample.main(VariableScopeExample.java:12)

👀 변수 v2를 선언한 범위 이상으로 사용하려고 해서 생긴 오류이다.

 

3. 기본 타입

1. 정수 타입

기본적으로 컴파일러는 정수 리터럴을  int 타입으로 간주한다.

따라서 정수 리터럴이 int 타입의 허용 범위를 초과할 경우, long 타입임을 컴파일러에게 알려 주어야 한다.

정수 리터럴 뒤에 소문자 l이나 대문자 L을 사용하여, long 타입임을 알린다.

package sec02.exam03;

public class LongExample {

	public static void main(String[] args) {
		long var1 = 10;
		long var2 = 20L;
		//long var3 = 1000000000000;
		long var4 = 1000000000000L;
		
		System.out.println(var1);
		System.out.println(var2);
		System.out.println(var4);
	}

}


>>> 10
>>> 20
>>> 1000000000000

(1) char 타입
: 작은 따옴표(')로 감싼 것을 유니코드로 변환되어 저장되는 문자 리터럴이라고 한다.

package sec02.exam04;

public class CharExample {

	public static void main(String[] args) {
		char c1 = 'A';
		char c2 = 65;
		char c3 = '\u0041'; //16진수로 저장
		
		char c4 = '가';
		char c5 = 44032;
		char c6 = '\uac00'; // 16진수로 저장
		
		System.out.println(c1);
		System.out.println(c2);
		System.out.println(c3);
		System.out.println(c4);
		System.out.println(c5);
		System.out.println(c6);
	}

}


>>> A
    A
    A
    가
    가
    가

👀 문자 리터럴을 int 타입에 저장할 경우 유니코드 자체가 출력된다!

(2) String 타입

: 큰따옴표(")로 감싼 문자 또는 여러 개의 문자들을 문자열이라고 부른다.

package sec02.exam05;

public class StringExample {

	public static void main(String[] args) {
		String name = "홍길동";
		String job = "프로그래머";
		System.out.println(name);
		System.out.println(job);
	}

}


>>> 홍길동
>>> 프로그래머
  • 이스케이프 문자 : 문자열 내부에 역슬래시(\)가 붙은 문자를 사용하는 것
    ➡ 문자열 내부에 특정 문자를 포함시킬 수 있다.
package sec02.exam06;

public class EscapeExample {

	public static void main(String[] args) {
		System.out.println("번호\t이름\t직업");
		System.out.print("행 단위 출력\n");
		System.out.print("행 단위 출력\n");
		System.out.println("우리는 \"개발자\"입니다.");
		System.out.print("봄\\여름\\가을\\겨울");
	}

}


>>> 번호	이름	직업
>>> 행 단위 출력
>>> 행 단위 출력
>>> 우리는 "개발자"입니다.
>>> 봄\여름\가을\겨울

2. 실수 타입

float과 double이 있다.

자바는 실수 리터럴을 기본적으로 double 타입으로 해석해서, 실수 리터럴을 float 타입으로 저장하고 싶다면 리터럴 뒤에 소문자 f나 대문자 F를 붙여 컴파일러가 float 타입임을 알 수 있도록 해야 한다.

package sec02.exam07;

public class FloatDoubleExample {

	public static void main(String[] args) {
		// 실수값 저장
		//float var1 = 3.14;
		float var2 = 3.14f;
		double var3 = 3.14;
		
		// 정밀도 테스트
		float var4 = 0.1234567890123456789f;
		double var5 = 0.1234567890123456789;
		
		System.out.println("var2: " + var2);
		System.out.println("var3 " + var3);
		System.out.println("var4 " + var4);
		System.out.println("var5 " + var5);
		
		//e 사용하기
		double var6 = 3e6;
		float var7 = 3e6F;
		double var8 = 2e-3;
		System.out.println("var6: "+var6);
		System.out.println("var7"+ var3);
		System.out.println("var8 " + var8);
	}

}


>>> var2: 3.14
>>> var3 3.14
>>> var4 0.12345679
>>> var5 0.12345678901234568
>>> var6: 3000000.0
>>> var73.14
>>> var8 0.002

🐰 double 타입인 var5가 float 타입인 var4보다 2배 이상 정밀한 값으로 출력된 걸 확인할 수 있군

3. 논리 타입

자바는 참과 거짓을 의미하는 논리 리터럴로 true와 false를 사용한다.

package sec02.exam08;

public class BooleanExample {

	public static void main(String[] args) {
		boolean stop = false;
		if (stop) {
			System.out.println("중지합니다.");
		} else {
			System.out.println("시작합니다");
		}
	}

}


>>> 시작합니다.

 

4. 타입 변환

1. 자동 타입 변환

값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생하는, 자동으로 타입 변환이 일어나는 걸 의미한다.

🐰 기본 타입의 허용 범위 크기 순 정리 (byte < short < int < long < float < double)

package sec03.exam01;

public class PromotionExample {

	public static void main(String[] args) {
		// 자동 타입 변환
		byte byteValue = 10;
		int intValue = byteValue;
		System.out.println("intVaule: "+intValue);
		
		char charValue = '가';
		intValue = charValue;
		System.out.println("가의 유니코드: "+intValue);
		
		intValue = 50;
		long longValue = intValue;
		System.out.println("longVaule: "+intValue);
		
		longValue = 100;
		float floatValue = longValue;
		System.out.println("floatValue: "+floatValue);
		
		floatValue = 100.5F;
		double doubleVaule = floatValue;
		System.out.println("doubleValue: "+doubleVaule);
	}

}


>>> intVaule: 10
>>> 가의 유니코드: 44032
>>> longVaule: 50
>>> floatValue: 100.0
>>> doubleValue: 100.5
  • 자동 타입 변환에서의 예외
    ➡ char 타입의 허용 범위는 음수를 포함하지 않는데, byte 타입은 음수를 포함하기 때문에 byte 타입은 char 타입으로 자동 변환될 수 없다.

2. 강제 타입 변환

큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것을 의미한다.

강제 타입 변환은 캐스팅 연산자 괄호()를 사용하는데, 괄호 안에 들어가는 타입나누는 단위이다. 

  • int 타입 ➡ byte 타입 : (byte) 캐스팅 연산자 사용
  • int 타입 ➡ char 타입 : (char) 캐스팅 연산자 사용
    👀 문자를 출력할 수 있기 때문에 char 타입으로 변환
  • 실수 타입 (float, double) ➡ 정수 타입 (byte, short, int, long)
    👀 소수점 이하 부분은 버려지고, 정수 부분만 저장
package sec03.exam02;

public class CastingExample {

	public static void main(String[] args) {
		int intValue = 44032;
		char charValue = (char) intValue;
		System.out.println(charValue);
		
		long longValue = 500;
		intValue = (int) longValue;
		System.out.println(intValue);
		
		double doubleValue = 3.14;
		intValue = (int) doubleValue;
		System.out.println(intValue);
	}

}

>>> 가
>>> 500
>>> 3

3. 정수 연산에서의 타입 변환

정수 연산식에서는 두 피연산자 중 허용 범위가 큰 타입으로 변환되어 연산을 수행한다.

package sec03.exam04;

public class LongOperationExample {

	public static void main(String[] args) 
		byte value1= 10;
		int value2 = 100;
		long value3 = 1000L;
		long result = value1 + value2 + value3;
		System.out.println(result);
	}

}


>>> 1110

🐰 int 타입보다 허용 범위가 더 큰 long 타입이 피연산자로 사용되면, 다른 피연산자는 무조건 long 타입으로 변환하고 연산을 수행한다. 따라서, 연산 결과를 long 타입에 저장한다.

4. 실수 연산에서의 자동 타입 변환

피연산자 중 하나가 double 타입이라면, 다른 피연산자도 double 타입으로 자동 변환되어 연산을 수행한다. 

만약 꼭 int 타입으로 연산을 해야 한다면, double 타입을 int 타입으로 강제 변환하고 덧셈 연산을 수행하면 된다.

package sec03.exam05;

public class OperationPromotionExample {

	public static void main(String[] args) {
		byte byteValue1= 10;
		byte byteValue2= 20;
		int intValue1 = byteValue1 + byteValue2;
		System.out.println(intValue1);
		
		char charValue1 = 'A';
		char charValue2 = 1;
		int intValue2 = charValue1 + charValue2;
		System.out.println("유니코드="+intValue2);
		System.out.println("출력문자"+(char)intValue2);
		
		int intValue3 = 10;
		int intValue4 = intValue3/4;
		System.out.println(intValue4);
		
		int intValue5 = 10;
		double doubleValue = intValue5 / 4.0;
		System.out.println(doubleValue);
		
		int x = 1;
		int y = 2;
		double result = (double) x/y;
		System.out.println(result);
	}

}


>>> 30
>>> 유니코드=66
>>> 출력문자B
>>> 2
>>> 2.5
>>> 0.5

5. + 연산에서의 문자열 자동 타입 변환

자바에서 + 연산자는 두 가지 기능을 가지고 있다. 

피연산자가 모두 숫자라면 덧셈 연산을 수행하고,

피연산자 중 하나가 문자열인 경우에는 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 연산을 수행한다.

package sec03.exam06;

public class StringConcatExample {

	public static void main(String[] args) {
		// 숫자연산
		int value = 10 + 2 + 8;
		System.out.println("value: "+value);
		
		// 문자열 결합 연산
		String str1 = 10 + 2 + "8";
		System.out.println("Str1: "+str1);
		
		String str2 = 10 + "2" + 8;
		System.out.println("str2: "+str2);
		
		String str3 = "10" + 2 + 8;
		System.out.println("str3: "+str3);
		
		String str4 = "10" + (2 + 8);
		System.out.println("str4:" +str4);
	}

}

>>> value: 20
>>> Str1: 128
>>> str2: 1028
>>> str3: 1028
>>> str4:1010

👀 특정 부분을 먼저 연산하고 싶다면 해당 부분을 괄호()로 감싸주면 된다!

6. 문자열을 기본 타입으로 강제 타입 변환

  • 문자열을 기본 타입으로 변환할 때 
    원하는 변환 타입.parse변환타입(문자열);
    ex) byte value = Byte.parseByte("10");
  • 기본 타입을 문자열로 변경할 때
    String.valueOf();
    ex) String.valueOf(3);
package sec03.exam07;

public class PrimitiveAndStringConversionExample {

	public static void main(String[] args) {
		int value1 = Integer.parseInt("10");
		double value2 = Double.parseDouble("3.14");
		boolean value3 = Boolean.parseBoolean("true");
		
		System.out.println("value1: "+value1);
		System.out.println("value2: "+value2);
		System.out.println("value3: "+value3);
		
		String str1 = String.valueOf(10);
		String str2 = String.valueOf(3.14);
		String str3 = String.valueOf(true);
		
		System.out.println("str1: "+str1);
		System.out.println("str2: "+str2);
		System.out.println("str3: "+str3);
	}

}

>>> value1: 10
>>> value2: 3.14
>>> value3: true
>>> str1: 10
>>> str2: 3.14
>>> str3: true