언어/JAVA

변수, 타입

빨대도둑 2022. 11. 14. 16:15

프로그래밍 언어는 고급 언어와, 저급 언어로 구분된다.

고급언어: 컴퓨터와 대화할 수 있도록 만든 언어 중에서 사람이 쉽게 이해할 수 있는 언어. 컴파일 과정을 통해서 컴퓨터가 이해할 수 있도록 0과 1로 변환한 후 컴퓨터가 사용하게 된다.

저급언어: 기계어에 가까운 언어, 사람이 쉽게 이해할 수 없다. (예: 어셈블리어)

 

자바언어 특징

  1. 이식성이 높다: JRE가 설치되어 있는 모든 운영체제에서 실행 가능
  2. 객체 지향 언어(OOP): 객체를 먼저 만들고 이것을 하나씩 조립 및 연결해서 전체 프로그램을 만드는 기법. → 마치 자동차를 만들 때 부분별로 만든 뒤 최종적으로 조립하는 것과 비슷하다.
  3. 함수적 스타일 코딩을 지원한다
  4. 메모리를 자동으로 관리한다.→객체 생성 시 자동적으로 메모리 영역을 찾아서 할당하고, 사용이 완료되면 Garbage Collector을 실행시켜 자동적으로 사용하지 않는 객체를 제거한다.
  5. Multi-Thread를 쉽게 구현한다.→Multi-Thread는 병렬처리를 하기 위한 프로그래밍이다.
  6. Dynamic Loading(동적로딩)을 지원한다

 

JVM

운영체제는 자바 프로그램을 바로 실행할 수 없는데, 그 이유는 자바는 완전한 기계어가 아닌 중간 단계의 바이트 코드이기 때문에 이것을 해석하고 실행할 수 있는 가상의 운영체제가 필요하다. 이것이 JVM이다. 

JAVA SE(Standard Editon): 자바 프로그램들이 공통적으로 사용하는 JVM을 비롯해 자바 프로그램 개발에 필수적인 도구와 라이브러리 API를 지원한다. 클라이언트와 서버 프로그램에 상관없이 자바 프로그램을 개발하고 실행하기 위해서는 반드시 JAVA SE구현체인 JDK를 설치해야 한다.

JAVA EE(Enterprise Edition): 분산환경(네트워크, 인터넷)에서 서버용 애플리케이션을 개발하기 위한 도구 및 API를 정의한다. 서버용 애플리케이션으로 Servlet/JSP를 이용한 웹 애플리케이션, 분산처리 컴포턴트인 EJB(Enterprise Java Bean)그리고 XML웹서비스 등이 있다.

 

개발 순서

  1. .java 소스 파일작성
  2. 컴파일러(javac.exe)로 바이트 코드 파일(. class) 생성
  3. JVM 구동 명령어(java.exe)로 실행

 

소스 분석

- 자바 프로그램은 반드시 클래스(class) 블록(main()) 메서드(method)블록으로 구성되어야 한다. 메소드 블록은 단독으로 작성될 수 없고 항상 클래스 내부에서 작성되어야 한다. 

클래스: 필드 또는 메서드를 포함하는 블록

메서드: 어떤 일을 처리하는 실행문들을 모아 놓은 블록

public class 클래스이름{
	클래스블록
}

public static void 메소드이름 (String[] args){
	메소드 블록
}

public class Hello{
public static void main(String[] args){
	System.out.println("hello world");
	}
}

 

클래스 이름작성 시 주의점

  1. 소스파일명과 대소문자가 일치해야 한다.
  2. 숫자로 시작할 수 없다
  3. 공백을 포함하면 안 된다
  4. (중요) 메서드 이름도 개발자가 마음대로 정할 수 있지만, main() 메서드는 절대로 바꾸면 안 된다. 왜냐하면 java.exe로 JVM을 구동시키면 제일 먼저 main() 메서드를 찾아서 실행시키기 때문이다.

 

주석

//한줄만 주석
/*범위를 지정해서 주석 처리 */

System.out.println("문자열 큰따옴표, 작은따옴표는 /*주석이 될 수 없다.*/");
  • 주석은 많이 작성한다고 전체 프로그램의 크기가 커지는 것이 아니다. 따라서 설명이 필요한 코드에는 꼭 주석을 달도록 하자.
  • 복잡한 코드일수록 주석을 달면 전체 코드를 이해하기 쉽고, 수정이 용이하다.
  • 주석내용: 작성자, 작성일과 시간, 프로그램의 버전과 변경이력 등의 중요 정보, 주요 코드에 대한 설명
  • 도큐먼트 주석은 javadoc.exe명령어로 API도큐먼트를 생성하는 데 사용된다

 

세미클론( ; )

실행문: 변수 선언, 값 저장, 메서드 호출에 해당하는 코드

실행문을 작성할 때에는 반드시 마지막에 세미클론( ; )을 붙여서 실행문이 끝났음을 표시해야 한다.

<간단한 java 예제>

int x=1;
int y=2;
int result= x+y;
System.out.println(result);

 


변수

값을 저장할 수 있는 메모리의 공간. 변수에는 다양한 값을 저장할 수 있고, 한 가지 타입의 값만 저장할 수 있다.

<변수선언>

int stock;
//int 값을 저장할 수 있는 stock 변수 선언
double price;
//double 값을 저장할 수 있는 price 변수 선언
int x,y,z;

변수 이름은 메모리 주소에 붙여진 이름이다.

 

<작성 규칙>

  • 첫 번째 글자는 문자이거나 $,_이여야 하며 숫자로 시작할 수 없다
  • 영어 대소문자가 구분된다
  • 첫번째 문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 첫 문자를 대문자로 한다
  • 문자수 길이의 제한은 없다
  • 자바 예약어는 사용할 수 없다

 

<변수값 저장>

int stock;
stock=005930;

//초기화 동시에 선언
int stock=005930

- 변수의 초기값은 코드에서 직접 입력하는 경우가 많은데, 소스 코드 내에서 직접 입력된 값을 리터럴이라고 부른다. 리터럴은 값의 종류에 따라서 정수 리터럴, 실수 리터럴, 문자 리터럴, 논리 리터럴로 구분된다. 

//문자열 리터럴
"큰따옴표로 묶은 텍스트는 리터럴로 간주"
"큰 따옴표 안에는 텍스트가 없어도 문자열 리터럴로 간주"
"문자열 리터럴을 저장하는 타입은 String만 있다"

//논리 리터럴
true, false 가 있다.

 

리터럴

변수의 초기값은 코드에서 직접 입력하는 경우가 많은데, 소스 코드 내에서 직접 입력된 값이다.

종류(데이터 값에 따라 구분): 정수 리터럴, 실수 리터럴, 문자 리터럴, 논리 리터럴

  • 정수 리터럴
    • 저장타입: byte, char, short, ing long
    • 10진수: 소수점이 없는 정수 리터럴 (22, 0, 1000)
    • 8진수: 0으로 시작하는 리터럴 (02, -05)
    • 16진수: 0x 또는 0X로 시작하고, 0~9 숫자나 ABCDEF, abcdef로 수성된 리터럴
  • 실수 리터럴
    • 저장타입: float, double
    • 10진수 : 소수점이 있는 리터럴 (0.24, 3.1415)
    • 10진수 지수와 가수: 대분자 E, 소문자 e가 있는 리터럴 (5E9=5x10^9, 2.2e-5=2.2x10^-5)
  • 문자 리터럴
    • 저장타입: char
    • 작은따옴표(’ ‘)로 묶은 텍스트는 하나의 문자 리터럴로 간주한다. (’A’, ‘t’, ‘\n’)
  • 문자열 리터럴
    • 저장타입: String
    • 큰 따옴표로(” “) 묶은 텍스트는 리터럴로 간주 (”kospi”, “한국”)
    • 큰 따옴표 안에는 텍스트가 없어도 문자열 리터럴로 간주한다.
  • 논리 리터럴
    • 저장타입: boolean
    • true, false

 

변수의 사용 범위

  • 변수는 {중괄호} 내에서 선언되고 사용된다.
  • 변수는 선언된 블록 내에서만 사용이 가능하다.
  • 중괄호 블록은 클래스, 생성자, 메서드에서 사용된다
public class Example{
	public static void main(String[] args){
		/*main 문이 있는 이곳이 메소드 블럭
	}
/*class로 선언한 부분이 클래스 블록
}
  • 메소드 블록 내에서 선언된 변수를 local variable (로컬변수)라고 부른다.
  • 로컬 변수는 메소드 실행이 끝나면 자동으로 없어진다. (Garbage Collector)

 

변수값 사용위치

  • 변수가 어떤 위치에서 사용될 것인지 생각하고 선언위치를 결정한다
  • 메서드 블록에서 어떤 위치에서건 사용할 수 있도록 한다면 메소드 블록 첫머리에 선언하는 것이 좋다.
  • 제어문 내에서 잠깐 사용하는 변수라면 제어문 내에서만 선언하는 것이 좋다.
public class Example{
	public static void main(String[] args){
		int a=2;
		if(a>0){
			int b=a+1;
		}
	int c=a+b;    //<- 이경우 b변수를 사용할 수 없다.
	}
}

 


데이터 타입

모든 변수에는 타입이 있으며 타입에 따라 저장할 수 있는 값의 종류와 범위가 달라진다. 변수를 선언할 때 주어진 타입은 변수를 사용하는 도중에 변경할 수 없다

값의 종류 기본타입 메모리 사용크기
정수 byte 1byte 8bit
char 2byte 16bit
short 2byte 16bit
int 4byte 32bit
long 8byte 64bit
실수 float 4byte 32bit
double 8yte 64bit
논리 boolean 1byte 8bit

정수타입: 자바는 기본적으로 정수연산을 int타입으로 수행한다. 그렇기 때문에 저장하려는 값이 정수 리터럴이라면 특별한 이유가 없는 한 int타입 변수에 저장하는 것이 좋다.

byte타입: 색상정보, 파일 또는 이미지 등의 이진 데이터를 처리할 때 주로 사용한다.

char타입: 문자를 처리한다. 자바는 모든 문자를 유니코드로 처리한다.

short타입: C언어와 호환을 위해서 사용하며 비교적 자바에선 잘 사용하지 않음

long타입: 수치가 큰 데이터를 다루는 프로그램에서 필수적으로 사용. 뒤에 L이나 l(소문자)를 붙여서 사용. (long var=1000L;)

실수타입: 소수점이 있는 실수 데이터를 저장하는 타입. 메모리 크기에 따라서 float과 double이 있다. int와 long과 메모리 크기는 같지만 정수 타입과 다른 저장방식 때문에 더 큰 값을 저장할 수 있다.

논리 타입: boolean타입은 논리값(true/false)을 저장할 수 있는 데이터 타입이다. 주로 조건문과 제어문의 실행 흐름을 변경하는 데 사용한다.

package A.demo;

public class demo {
	public static void main(String[]args) {
		double var1=3.14;
		float var2=3.14f;
		
		double var3=0.1234567890123456789;
		double var4=0.12345678912345679f;
		
		System.out.println("var1+"+var1);
		System.out.println("var2+"+var2);
		System.out.println("var3+"+var3);
		System.out.println("var4+"+var4);
		
		int var5=3000000;
		double var6=3e6;
		float var7=3e6f;
		double var8=2e-3;
		System.out.println("var5+"+var5);
		System.out.println("var6+"+var6);
		System.out.println("var7+"+var7);
		System.out.println("var8+"+var8);
	}
}

 

<타입 변환>

타입변환이란 데이터의 타입을 다른 데이터 타입으로 변환하는 것을 말한다. 

> 자동 타입변환은 프로그램 실행 도중 자동적으로 타입 변환이 일어나는 것을 말한다. 자동 타입 변환은 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다 

> 자동 타입 변환이 발생되면 변환 이전의 값과 변환 이후의 값은 동일하다. 즉 변환 이전의 값은 변환 이우에도 손실 없이 그대로 보존된다. 

> 음수가 저장될 수 있는 byte타입을 char타입으로 자동변환이 불가능하다. 

 

자동(묵시적) 타입 변환

프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다.

작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다.

byte byteVal=100;
int intVal=byteVal;
//이때 int가 byte 보다 크기 때문에 자동 타입 변환이 발생한다.

 

타입별 크기

byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)

 

강제(명시적) 타입변환

강제적으로 큰 데이터 타입을 작은 데이터 타입으로 쪼개어서 저장하는 것을 강제 타입변환(casting)이라고 한다. 강제 타입변환은 캐스팅 연산자()를 사용하는데 괄호 안에 들어가는 타입은 쪼개는 단위이다. 

int intvalue=321654;
byte bytevalue = (byte) intvalue;

주의할 점

  • 사용자로부터 입력받은 값을 변환할 때 값의 손실이 발생하면 안 된다.
  • 강제 타입 변환을 하기 전에 우선 안전하게 값이 보존될 수 있는지 검사하는 것이 좋다.
  • 정수 타입을 실수 타입으로 변환할 때 정밀도 손실을 피해야 한다
package A.demo;

public class demo {
	public static void main(String[]args) {
		byte byteValue1=10;
		byte byteValue2=20;
		
		int intValue=byteValue1+byteValue2;
		System.out.println(intValue);
		
		char charValue1='A';
		char charValue2='B';
		
		int intValue2=charValue1+charValue2;
		System.out.println("유니코드= ",intValue);
		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);
	}
}