Yang.공부방

데이터 타입

Java2020. 4. 8. 21:16

 데이터타입(Data Type)이란? 

: 자바 언어가 처리할 수 있는 데이터(자료) 종류를 의미하며 기본 데이터형과 참조 데이터형이 있다.


 기본타입 (primitive)

: 메모리에는 0 과 1 을 저장하는 최소 기억단위인 비트(bit)가 있다.

8개의 비트를 묶어 바이트(byte)라고 한다 ex)1byte = 8bit  [0000 0000]

 값 종류

타입 

메모리 사용 크기 

저장되는 값의 범위 

정수

byte

1 byte

8 bit 

 -128~127

short

2 byte

16 bit

-32768~32767  

int

4 byte

32 bit

-2147483648~214838647

long

8 byte

64 bit

-9223372036854775808~9223372036854775807

실수

float

4 byte

32 bit

1.40239846e-45f ~3.40282347e+38f

double

8 byte

64 bit

4.94065645841246544e-324~1.79769313486231570e+308

문자

char

2 byte

16 bit

'\u0000' ~ 'uFFFF' (16비트 유니코드 문자 데이터)

논리

boolean

1 byte

 8 bit

 true 또는 false

각 타입별 저장되는 값의 범위보다는 메모리크기를 알아두면 좋다. 메모리 크기를 알고있으면 사용되는 값의 범위를 대략 알 수 있기 때문이다. 

정수타입의 저장되는 값의 범위는 -2^(n-1) ~ (2^(n-1)-1)이다.


변수마다 사용할 수 있는 값의 범위를 초과하면 오버플로우(overflow)현상이 발생하는데 이것은 쉽게 설명하면 그릇에 담을 수 있는 한계를 초과하여 흘러넘친다는 뜻이다. 

오버플로우 현상이 발생하면 엉뚱한 값이 들어갈 수 있고 에러의 원인이 된다.

 

 

[byte타입의 값을 초과하여 최소값부터 다시 반복 저장된 결과이다(쓰레기값)]


[정수타입] (byte, short, int, long)

byte타입 : 색상정보 및 파일 또는 이미지 등 이진데이터를 처리할 때 사용

char타입 : 자바는 모든 문자를 유니코드(Unicode)로 처리한다(직접 유니코드 정수 값(음수값은 없다)을 저장할 수 있다 ex) char c = 65; 또는 char c = '\u0041';)

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

int타입 : 메모리가 크게 부족하지 않다면 정수를 저장할 때 int타입을 사용한다

long타입 : 수치가 큰 데이터를 다루는 프로그램에서 필수적으로 사용한다 ex)은행 및 우주 관련된 프로그램


[실수타입] (float, double) 소수점값을 나타내기 위해 사용 (부동소수점(floating-point)방식으로 저장)

 

 

flolat : 부호(1bit) + 지수(8bit) + 가수(23bit) = 32bit = 4byte

double : 부호(1bit) + 지수(11bit) + 가수(52bit) = 64bit = 8byte


 

[실수 리터럴의 기본타입은 double이므로 float리터럴은 끝에 F,f를 붙이도록 한다]


 

 

[정수 리터럴에 10의 지수를 나타내는 E,e가 있을 경우 실수타입에 저장해야 한다]


[논리타입] (boolean) true 또는 false 값을 저장하며 조건문 또는 제어문의 실행 흐름을 변경할 때 사용 (소문자만 인식)

 

 

[stop변수의 값이 false 이므로 else의 값이 출력된다]



 참조타입 (reference)

: 객체의 번지를 참조하는 타입으로 배열(array), 열거(enum), 클래스(class), 인터페이스(interface) 타입을 말한다.

기본과 참조의 차이는 저장되는 값이 무엇인가? 이다 

기본타입은 선언된 변수는 실제 값을 변수에 저장하지만 참조타입은 배열, 열거 ,클래스, 인터페이스를 이용하여 메모리에 번지를 값으로 갖게된다.

 

 [자료 참고 : https://kingpodo.tistory.com/54]


 메모리 사용 영역

java.exe로 프로그램을 실행하면 JVM이 실행된다. JVM은 운영체제에서 할당받은 메모리 영역을 메소드,스레드,힙과 같은 세부 영역으로 구분해서 사용한다. 

이때 쓰레드 영역마다 하나의 JVM스택영역이 존재하게 된다.

 

[자료 참고 : https://kingpodo.tistory.com/54]

1. 메소드 영역 (Method Area)

: 런타임 상수 풀, 필드 / 메소드 데이터, 메소드 코드, 생성자 코드 등으로 분류하여 저장한다.

: 메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역

2. 힙 영역 (Heap Area)

: 객체와 배열이 생성되는 영역이며 JVM스택영역의 변수나 다른 객체의 필드에서 참조한다.

: 참조하는 변수나 필드가 없다면 의미없는 객체가 되기 때문에 쓰레기로 취급하고 JVM은 Garbage Collector를 실행시켜 쓰레기 객체를 힙 영역에서 자동으로 제거합니다.

: Java는 개발자가 직접적으로 객체를 제거시키는 방법을 제공하지 않는다(System.gc() 메소드가 있지만 JVM에게 요청을 하는 형태이다)

3. JVM(Java Virtual Machicne) Stack Area

: 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다.

: 추가적으로 스레드를 생성하지 않으면 main스레드만 존재하므로 JVM스택도 하나이다.

: JVM스택은 메소드를 호출할 때 마다 프레임을 추가하고 메소드가 종료되면 프레임을 제거한다.

: 배열은 객체로 취급한다 (내부에서 생성된 변수는 해당 로컬 변수 스택에만 존재하여 해당 구문을 나오면 제거되어 외부에서 사용이 불가하지만 배열은 스택 영역에 생성되지만 배열 데이터 자체는 Heap영역에 생성되어 제거되지않는다)

'Java' 카테고리의 다른 글

변수와 리터럴  (0) 2020.04.07
주석처리 컴파일(인코딩)오류  (1) 2020.04.04
자바(JDK), 이클립스 설치 및 환경구축  (0) 2020.04.03
자바 시작하기  (0) 2020.04.03

변수와 리터럴

Java2020. 4. 7. 21:06

  변수란? 하나의 값을 저장할 수 있는 메모리공간(변할 수 있는 수)

: 변수는 선언된 블록 내에서만 사용이 가능하다 (아래 사진은 블럭안에 있는 변수를 밖에서 사용하려 시도하다 오류가 발생한 사진이다)


변수 선언방법 (타입 + 변수이름)

1
2
int age;
double value;




변수 선언과 값 저장(우측에 있는 값을 좌측 변수에 저장)
1
2
int age = 1;        
double value = 1.5;




변수 이름을 위한 명명 규칙 

  작성 규칙

 예 

 첫번째 글자는 문자이거나 '$','_'이어야 하며 숫자는 사용불가

 가능 : price, $price, _companyName

불가능 : 1v, @speed, $#value

 영어 대소문자 구분이 된다

 firstname 과 firstName 은 다른 변수

  첫문자는 소문자로 시작하되, 다른 단어가 붙을경우 대문자로 한다

 amxSpeed,firstName, carBodyColor 

 문자 수 제한이 없다

 

  자바 예약어는 사용불가

 기본 데이터 값, 접근지정자, 클래스 관련 등등... 


변수값 읽기

변수는 초기화가 되어야 읽을 수 있으며, 초기화되지 않는 변수는 읽을 수 없다

1
2
int value;
int result = value +10;


[변수를 초기화 하지 않을 시 오류 발생]




1
2
int value = 30;
int result = value +10;
cs

[변수를 사용하지 않을 시 뜨는 문구] 


  리터럴이란? 소스 코드 내 직접 입력된 값


정수 리터럴 (byte, char, short, int, long) 

1
2
3
4
5
6
7
8
9
10
11
//소수점이 없는 정수 리터럴은 10진수
int var1 = 10;
System.out.println("var1 : "+var1);//출력결과 : 10
    
//0으로 시작되는 리터럴은 8진수
int var2 = 010;
System.out.println("var2 : "+var2);//출력결과 : 8
    
int var3 = 0x10;
//0x 또는 0X로 시작하고 0~9 숫자나 알파벳으로 구성된 리터럴은 16진수
System.out.println("var3 : "+var3);//출력결과 : 16
cs


실수 리터럴 (float, double)

1
2
3
4
5
6
7
//소수점이 있는 리터럴은 10진수 실수로 간주
double var4 = 0.25;
System.out.println("var4 : "+var4); //출력결과 : 0.25
 
//대문자 E 또는 소문자 e가 있는 리터럴은 10진수 지수와 가수로 간주한다.
double var5 = 2E5;
System.out.println("var5 : "+var5); //출력결과 : 200000.0
cs


문자 리터럴 (char)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//작은 따옴표(')로 묶은 텍스트는 하나의 문자 리터럴로 간주한다.ex) 'A', '한', '\t', '\n'
//\가 들어가면 이스케이프문자라고 하는데 특수한 용도로 사용
char var6 = 'A';
System.out.println("var6 : "+var6);
        
char var7 = '한';
System.out.println("var7 : "+var7);
        
System.out.println('\t' + "들여쓰기");//들여쓰기
System.out.println("\t들여쓰기2");
        
System.out.println('\n' + "줄바꿈");//줄바꿈
System.out.println("\n줄바꿈2");
        
System.out.println('\r' + "리턴");//r은 리턴의 개념
System.out.println("\r리턴2");
        
System.out.println("This" + '\'' + "s Java");//작은 따음표('\'')
System.out.println("이것은" + '\"' + "자바" + '\"' + "입니다");//큰 따음표('\"')
        
char var8 = '\u0041';
System.out.println("var8 : " + var8);
cs

[출력 결과]


문자열 리터럴 (String)

1
2
3
4
5
//문자열 리터럴 (문자열 리터럴을 저장 할 수 있는 타입은 string밖에 없다)
//큰 따옴표("")로 묶은 텍스트는 문자열 리터럴로 간주한다. ex) "대한민국"
//문자열 리터럴 내부에서 이스케이프 문자 사용가능 ex) "탭 만큼 이동 \t 합니다"
String var9 = "Yang";
System.out.println("작성자는\t" + var9 + "입니다");
cs

[출력 결과]


논리 리터럴 (boolean)

1
2
3
//논리 리터럴(논리 리터럴은 boolean밖에 없다)
boolean var10 = true;
System.out.println("var10 : " + var10);
cs

[출력 결과]


'Java' 카테고리의 다른 글

데이터 타입  (0) 2020.04.08
주석처리 컴파일(인코딩)오류  (1) 2020.04.04
자바(JDK), 이클립스 설치 및 환경구축  (0) 2020.04.03
자바 시작하기  (0) 2020.04.03

주석처리 컴파일 중 인코딩 오류 발생



컴파일 오류


컴파일 시 error: unmappable character (0xEC) for encoding x-windows-949오류 발생

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
C:\Temp>javac Hello.java
 
Hello.java:5: error: unmappable character (0xEC) for encoding x-windows-949
        //?옉?꽦?옄 : Yang
          ^
Hello.java:5: error: unmappable character (0xEC) for encoding x-windows-949
        //?옉?꽦?옄 : Yang
            ^
Hello.java:5: error: unmappable character (0xEC) for encoding x-windows-949
        //?옉?꽦?옄 : Yang
              ^
Hello.java:7: error: unmappable character (0xEC) for encoding x-windows-949
        ?옉?꽦?씪 : 2020.4.4
        ^
Hello.java:7: error: unmappable character (0xEC) for encoding x-windows-949
        ?옉?꽦?씪 : 2020.4.4
          ^
Hello.java:7: error: unmappable character (0xEC) for encoding x-windows-949
        ?옉?꽦?씪 : 2020.4.4
            ^
Hello.java:8: error: unmappable character (0xED) for encoding x-windows-949
        ?뀒?뒪?듃?슜
        ^
Hello.java:8: error: unmappable character (0xEC) for encoding x-windows-949
        ?뀒?뒪?듃?슜
          ^
Hello.java:8: error: unmappable character (0xED) for encoding x-windows-949
        ?뀒?뒪?듃?슜
            ^
Hello.java:8: error: unmappable character (0xEC) for encoding x-windows-949
        ?뀒?뒪?듃?슜
              ^
10 errors
cs

[오류 내용]

교재의 예문을 따라 하는 과정 중 오류가 발생하여 내용을 살펴보니 인코딩에 문제가 있다는 것을 알게 되었다.

한글 문자는 역사적인 이유로 각각의 문자를 비트열로 부호화하는 방식(인코딩)이 몇가지 있는데 대표적으로 utf-8, euc-kr, cp949, ms949이 있다.

위 오류는 utf-8로 인코딩된 코드를 자바 컴파일에서 한글 윈도우의 기본 인코딩을 따라서 ms949 방식으로 읽으려고 시도 했지만 실패하여 발생한 것이다.

utf-8, ms949와 같은 한글 인코딩은 1바이트로 표시되는 영문자를 포함한 ascii문자에서만 서로 호환성을 가질 뿐이라서 영문자들은 잘 표시하지만 한글은 알 수 없다는 문자로 해석될 뿐이다.


해결방법


해결방법으로는 컴파일러의 인코딩 방식과 소스파일을 일치시켜주는 3가지 방법이 있는데 아래와 같다.

  1. 편집기에서 파일 인코딩을 ms949로 저장 하도록 하는 방법

  2. 통합개발환경에서 컴파일 옵션으로 -encoding utf-8을 설정하는 방법

  3. 자바 컴파일러에게 명시적으로 파일의 인코딩을 지정하는 방법 ex)javac 파일명 -encoding utf-8


1
C:\Temp>javac Hello.java -encoding UTF-8
cs



'Java' 카테고리의 다른 글

데이터 타입  (0) 2020.04.08
변수와 리터럴  (0) 2020.04.07
자바(JDK), 이클립스 설치 및 환경구축  (0) 2020.04.03
자바 시작하기  (0) 2020.04.03

Java SE 구현체 종류

1. JDK - 자바 프로그램 개발 및 실행하기 위해 반드시 설치(JRE+개발도구)

2. JRE - 자바 프로그램을 실행할 경우 설치(JVM+표준 클래스 라이브러리)


자바 개발 도구 (JDK) 설치 설치 파일 다운로드 사이트 : (http://www.oracle.com/) 운영체제별, CPU종류별 파일이 다름

이클립스 (Eclipse) 설치 설치 파일 다운로드 사이트 : (https://www.eclipse.org/) ※사용 시 JDK필요



환경 변수 생성 및 수정

: "JAVA_HOME" 생성 - JDK 설치 디렉토리로 지정(서버구동시 JDK의 설치 위치를 알기 위해 사용)

: "PATH" 수정 - %JAVA_HOME%\bin; 추가(임의의 디렉토리에서 자바 명령어(javac.exe, java.exe)를 실행시키기 위해 설정)



이클립스 설치



메모장으로 컴파일



이클립스에서 Hello World 찍기


'Java' 카테고리의 다른 글

데이터 타입  (0) 2020.04.08
변수와 리터럴  (0) 2020.04.07
주석처리 컴파일(인코딩)오류  (1) 2020.04.04
자바 시작하기  (0) 2020.04.03

자바 시작하기

Java2020. 4. 3. 21:33

자바란?

1995년도 썬마이크로시스템즈(썬)에서 최초 발표한 언어이다.(가전 제품에서 사용할 목적인 오우크(Oak)언어에서 시작하여 인터넷 프로그래밍 언어로 발전하면서 자바라는 이름으로 변경

2010년 오라클에서 썬을 인수하여 개발,관리,배포를 주관한다


특징

1. 이식성이 높다.

: 소스코드파일(.java) ->한 번의 컴파일-> 클래스파일(.class)->Ms윈도우,리눅스,맥

2. 객체지향 언어.

: 부품 객체를 먼저 만들고, 이것들을 조합해서 전체 프로그램을 완성하는 기법

: 자바는 처음부터 OOP(Object Oriented Programming) 개발용 언어로 설계되었다. (캡슐화,상속,다형성 기능 지원)

3. 함수적 스타일 코딩 지원(람다식(Lambda Expressions))

: 코드를 간결하게 작성가능

: 컬렉션 요소를 필터링, 매핑, 그룹핑, 집계처리 시 사용

4. 메모리 자동 관리.

: 사용하지 않는 객체를 자동으로 메모리에서 제거한다.

: 핵심 기능 코드에 집중할 수 있도록 해준다.

5. 다양한 애플리케이션 개발가능.

: 콘솔 프로그램, UI애플리케이션, 서버 애플리케이션, 모바일 앱 등을 개발가능

: Java SE - 기본에디션(자바프로그램을 실행시키는 JVM정의, 자바 프로그램들이 공통으로 사용하는 개발도구와 API, 구현체 - JDK)

: Java EE -  서버 애플리케이션 개발 에디션(웹 애플리케이션, 웹 서비스, 분산 컴포넌트를 위한 개발 도구와 API, 구현체 - WAS(Web Application server(Tomcat, WebLogic, Jeus, Jboss...)))

: Java ME - 임베디드 또는 모바일 장비를 위한 개발도구

6. 멀티 스레드(Multi-Thread)를 쉽게 구현가능

: 동시에 여러 작업을 할 경우 - 병렬처리 필요 - 멀티 스레드 필요

: 대용량 작업을 빨리 처리할 경우 - 병렬처리 필요 - 멀티 스레드 필요

: 운영체제 별 멀티스레드를 이용하는 API가 다름 - Java API로 일관된 생성 및 관리

7. 동적로딩(Dynamic Loading)을 지원

: 필요한 시점에 동적을 로딩해서 객체를 생성할 수 있다.

: 유지보수시 특정 객체만 쉽게 수정 및 교체 가능

8. 오픈소스 라이브러리가 풍부

: 노력과 시간 비용절약 및 유지보수의 편리성


'Java' 카테고리의 다른 글

데이터 타입  (0) 2020.04.08
변수와 리터럴  (0) 2020.04.07
주석처리 컴파일(인코딩)오류  (1) 2020.04.04
자바(JDK), 이클립스 설치 및 환경구축  (0) 2020.04.03