C1~C3

0

이것이 자바다

목록 보기
1/18
post-thumbnail

1.5 바이트코드 파일과 자바 가상 머신

(회사 키보드 키감이 나빠 오타 있을 수 있습니다.)

바이트코드 파일 :

소스파일을 작성한 후에는 컴파일을 해야한다. javac 명령어는 소스 파일을

컴파일 하는데, 컴파일 결과는 확장명이 .class인 바이트코드 파일로 생성된다.

어떤 운영체재라 하더라도 동일한 소스 파일을 javac로 컴파일하면 모두 동일한 바이트코드 파일로 생성이 된다.

자바 가상 머신 :

바이트코드 파일을 특정 운영체재가 이해하는 기계어로 번역하고 실행시키는 명령어는 java이며 java 명령어는 JDK와 함께 설치된 자바 가상머신을 구동시켜 바이트코드 파일을 완전한 기계어로 번역하고 실행시킨다.

2. 변수와 타입

2.1 변수 선언

변수 =

하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름. 정수형 변수는 정수만, 실수형 변수는 실수만 저장이 가능하다.

변수 선언:

어떤 타입의 데이터를 저장할 것인지 그리고 변수 이름이 무엇인지를 결정하는 것이다.

int value; 에서 int는 타입, value 이름 이다.

(캐멀 스타일을 사용하며 이름이 길어도 되지만 한글을 포함하지 않는 것이 관례이다.)

변수에 최초로 값을 대입하는 것이 초기화. 이때 값을 초기값.

선언과 동시에 대입이 가능하다. > int score = 90;

잘못된 예

int value;

int result = value + 10; // 변수 value가 초기화 되지 않아 메모리 값을 읽을 수 없다.

변수 값을 교환하는 방법 :

public class VariableExchangeExample {
	public static void main(String[] args) {
    int x = 3;
    int y = 5;
    
    int temp = x;  // x값을에 temp을 저장.
    x = y;			// y값을를 x에 저장
    y = temp;		// temp값을 y에 저장
    }				//
}

temp 라는 변수를 선언해 x와 y의 값을 서로 교환한다.

2.2 정수타입

byte, char, short, int, long. 변수는 8개의 기본타입이 존재, 그 중 정수 타입은 5개이다.

타입메모리 크기저장되는 값의 허용 범위저장되는 값의 허용 범위
byte1byte / 8bit-2⁷ ~ (2⁷-1)-128~ 127
short2byte / 16bit-2¹⁵ ~ (2¹⁵-1)-32,768 ~ 32,767
char2byte / 16bit0 ~ (2¹⁶-1)0 ~ 65535 (유니코드)
int4byte / 32bit-2³¹ ~ (2³¹-1)-2,147,483,648 ~ 2,147,483,647
long8byte / 64bit-2⁶³ ~ (2⁶³-1)-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

프로그래머가 직접 입력한 값을 "리터럴"이라고 하며 변수에 대입할 정수 리터럴은 진수에 따라 작성하는 방법이 다르다.

  • 2진수는 0b, 0B로 시작하여 0, 1로 작성
  • 8진수는 0으로 시작하여 0~7로 작성
  • 10진수는 소수점이 없는 0~9로 작성
  • 16진수는 0x또는 0X로 시작하고 0~9 숫자나 a~f , A~F로 작성
    정수는 기본적으로 int타입 실수 타입은 double로 간주한다.

2.3 문자 타입

문자 리터럴은 유니코드로 변환되어 저장된다. 유니코드로 저장가능한 char 타입을 제공한다.

유니코드가 정수이므로 char 타입도 정수 타입에 속한다 그렇기에 char 변수에 작은따옴표로 감싼 문자가 아니라 유니코드 숫자를 직접 대입할 수도 있다. 하지만 char c = ''; 작은 따옴표 안에 공백을 넣지 않으면 컴파일 오류가 나니 주의해야 한다.

2.4 실수 타입

타입메모리 크기저장되는 값의 허용 범위유효 소수 이하 자리
float4byte / 32bit1.4x10-⁴⁵ ~ 3.4x10³⁸7자리
double8byte / 64bit4.9x10-³²⁴ ~ 1.8x10³⁰⁸15자리

double이 0에 더 가까운 실수를 저장할 수 있고 정밀도 또한 높다.
자바는 IEEE 754 표준에 근거하여 float , double 타입의 값을 부동 소수점 방식으로 메모리에 저장.
[ float ] 부호(1bit) + 지수(8bit) + 가수(23bit) = 32bit
[ double ] 부호(1bit) + 지수(8bit) + 가수(52bit) = 62bit
float 사용시 리터럴 뒤에 f, F를 붙여 컴파일러가 float 타입임을 알 수 있도록 해야한다.

2.5 논리 타입

boolean은 true , false 즉 참과 거짓을 의미하는 논리 리트럴을 대입할 수 있다.

boolean은 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는데 사용된다.

2.6 문자열 타입

큰따옴표로 감싼 여러 개의 문자들은 유니코드로 변환되지 않는다. 문자열을 변수에 저장하고 싶다면 String 타입을 이용해야한다. (참조 타입)

2.7 자동 타입 변환

자동으로 타입 변환이 일어나는 것을 말한다. 자동 타입 변환은 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 대입될 때 발생한다.

2.8 강제 타입 변환

큰 그릇을 작은 그릇 단위로 쪼개어서 한 조각만 작은 그릇에 넣는 것. 큰 허용 범위 타입을 작은 허용 범위 타입으로 쪼개어서 저장하는 것을 강제 타입 변환이라고 한다.

int > byte 로 강제 타입 변환시 끝 1byte가 저장되어 byte 타입으로 저장
강제 타입 변환을 캐스팅이라고 하기도 한다.

2.9 연산식에서 자동 타입 변환

byte result = 10 + 20;

자바 컴파일러는 컴파일 단계에서 10 + 20을 미리 연산해서 30을 만들고 result 변수에 30을 저장 하도록 바이트코드를 생성한다, 하지만 정수 리터럴이 아니라 변수가 피연산자로 사용되면 실행 시 연산을 수행한다. 정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산을 수행한다.

byte x = 10;
byte y = 20;
int result = x + y; //byte result = x + y; 컴파일 에러

int x = 10;
int y = 20;
int result = x + y; //이런식으로 타입 변환을 먼저 해주면 실행 성능에 도움이 된다.

int와 마찬가지로 int타입 보다 허용 범위가 더 큰 long, float, double 타입 같은 경우도 위와 같이 변환되어 연산된다.
int타입으로 연산을 해야 한다면 반대로 double 타입을 int타입으로 강제 변환하고 연산을 수행하면 된다.

int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int) doubleValue; // 10+5

피연산자가 모두 숫자일 경우에는 덧셈 연산을 수행하고, 피연산자 중 하나가 문자열일 경우에는 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 연산을 수행한다. 예를 들어

String str = "3" + 7;
String str = "3" + "7";
String str = "37";

String str = 1 + "2" + 3;
String str = "12" + "3" 
String str = "123"    //특정 부분 연산을 먼저하고 싶다면 () 사용

2.10 문자열을 기본 타입으로 변환

프로그램에서는 문자열을 숫자 타입으로 변환하는 경우가 매우 많다. '12'와 '3.5'를 정수 및 실수 타입으로 변환해서 숫자를 연산하는 경우이다.

String -->사용 예
byteByte.parseByte(str)
shortShort.parseShort(str)
intInteger.parseInt(str)
longLong.parseLong(str)
floatFloat.parseFloat(str)
doubleDouble.parseDouble(str)
booleanBoolean.parseBoolean(str)

int 타입만 Integer.parseInt 이다.

2.11 변수 사용 범위

{ } 블록 내에서 선언된 변수는 해당 중괄호 { } 블록 내에서만 사용이 가능하고 밖에서는 사용할 수 없다. 메소드 블록 전체에서 사용하고 싶다면 메소드 블록 첫머리에서 특정 블록 내부에서만 사용된다면 해당 블록내에서 선언하는 것이 좋다.

public static void main(String[] args)  {
int var1;

if(...) {
	int var2; //var1 ,var2 만 사용가능
   	}
}    

2.12 콘솔로 변수값 출력

우리는 지금까지 표준 출력 장치인 모니터에 값을 출력하기 위해 System.out.println()을 이용했다. 괄호 () 안에 리터럴을 넣으면 리터럴이 그대로 출력되고, 변수를 넣으면 변수에 저장된 값이 출력되었다.

println, print 설명은 제외하고 prinf만.

System.out.printf("이름 : %s", "김자바");  // 이름: 김자바
System.out.printf("나이 : %d", 25 ); // 나이: 25

System.out.printf("이름: %1$s, 나이: %2$d", "김자바", 25); // 이름: 김자바 , 나이: 25

2.13 키보드 입력 데이터를 변수에 저장

키보드로부터 입력된 데이터를 읽고 변수에 저장하는 가장 쉬운 방법은 Scanner를 사용하는 방법이다

Scanner scanner = new Scanner(Sytem.in);

System.out.print("A의 값을 입력해라");
String inputData = scanner.nextLine();

3.1 부호/증감 연산자

연산식연산식설명
+피연산자피연산자의 부호 유지
-피연산자피연산자의 부호 변경
++피연산자피연산자의 값을 1 증가시킴
--피연산자피연산자의 값을 1 감소시킴
피연산자--다른 연산을 수행한 후에 피연산자의 값을 1 증가시킴
피연산자++다른 연산을 수행한 후에 피연산자의 값을 1 감소시킴
정수타입 (byte , short ,int) 연산의 결과는 int타입이다. 부호를 변경하는 것도 연산이므로 int 타입 변수에 대입해야 한다.
byte b = 100;
int result = -b;

3.2 산술 연산자

연산식연산식연산식설명
피연산자+피연산자덧셈 연산
피연산자-피연산자뺄셈 연산
피연산자*피연산자곱셈 연산
피연산자/피연산자나눗셈 연산
피연산자%피연산자나눗셈의 나머지를 산출하는 연산

3.3 오버플로우와 언더플로우

오버플로우란 타입이 허용하는 최대값을 벗어나는 것을 말하며, 언더플로우는 타입이 허용하는 최소값을 벗어나는 것을 말한다. 에러가 발생하진 않고 최소값 또는 최대값으로 되돌아간다.

byte value = 127;
value++; // 127에 1을 더함
System.out.println(value); // -128
byte와 마찬가지로 short, int, long타입은 값의 범위만 다를 뿐 오버,언더 플로우가 발생시 마찬가지로 최대값, 최소값으로 되돌아간다.
오버플로우, 언더플로우는 우리가 기대하는 값이 아니므로 항상 해당 타입의 범위 내에서 연산이 수행되도록 코딩에 신경써야한다.

3.4 정확한 계산은 정수 연산으로

사과 1개를 0.1 단위의 10조각으로 보고, 그 중 7조각(0.7)을 뺀 3조각(0.3)을 result 변수에 저장한다.
  		int apple = 1;
        double pieceUnit = 0.1;
        int number = 7;

        double result = apple - number*pieceUnit;
        System.out.println("apple : " + result); // 0.2999999999~~

출력된 결과를 보면 정확히 0.3이 되지않는다. 부동 소수점 방식을 사용하는 실수 타입에서 흔히 일어나며 정확한 계산이 필요하다면 정수 연산으로 변경해 계산하는 것이 좋다.

 		int apple = 1;
        int totalPieces = apple * 10;
        int number = 7;

        int result = totalPieces - number;
        System.out.println("10조각에서 남은 조각: " + result); // 3
        System.out.println("사과 1개에서 남은 양: "+ result/10.0); //0.3

이렇게.

3.5 나눗셈 연산 후 NaN과 Infinity 처리

나눗셈 , 나머지 연산에서 좌측 피연산자가 정수, 우측 피연산자가 0일 경우 무한대의 값이고, 정수로 표현이 불가능하기 때문에. 예외가 발생한다

int x = 5;
int y = 0; 
int result = x / y; // 예외 발생
하지만 좌측 피연산자가 실수이거나 우측 피연산자가 0.0또는 0.0f이면 예외가 발생하지 않고 연산의 결과는 Infinity , NaN이 된다. 이 경우 계속 연산을 하면 결과는 계속해서 Infinity , NaN이 되므로 데이터가 엉망이 될 수 있다.
boolean result = Double.isInfinity(변수); 
boolean result = Double.isNaN(변수); // Infinity , NaN 일경우 true 아니면 false를 산출
그래서 /와 % 연산의 결과가 Infinity , NaN인지 먼저 확인 후 연산을 수행하는 것이 정신건강에 이롭다. (Double.isInfinity(변수) , Double.isNaN(변수)을 사용)

3.6 비교 연산자

비교 연산자는 동등(==, !=) , 크기 ( <, <= , >, >=)를 평가해서 boolean 타입인 true/false를 산출하며 흐름 제어문인 조건문, 반복문에서 흐름을 제어할 때 주로 사용된다.

구분연산식연산식연산식설명
동등비교피연산자1==피연산자2두 피연산자의 값이 같은지를 검사
동등비교피연산자1!=피연산자2두 피연산자의 값이 다른지를 검사
크기비교피연산자1>피연산자2피연산자1이 큰지를 검사
크기비교피연산자1>=피연산자2피연산자1이 크거나 같은지를 검사
크기비교피연산자1<피연산자2피연산자1이 작은지를 검사
크기비교피연산자1<=피연산자2피연산자1이 작거나 같은지를 검사
'A' == 65 //true
 3 == 3.0 //true
예외가 있는데 0.1f == 0.1에서 0.1f가 double 타입으로 변환되면 0.1 == 0.1이 되어 true가 산출되어야 하지만, 이 결과값은 false가 산출된다.
0.1f == 0.1 //false
그 이유는 부동 소수점 방식을 사용하는 실수 타입은 0.1을 정확히 표현할 수 없고 두 타입간의 정밀도 차이 때문이다. 해결 방법은 float으로 캐스팅하여 연산하면된다.
0.1f == (float) 0.1 // true
문자열을 비교 할 때는 equals()와 !equals()를 사용한다.

3.7 논리 연산자

논리 연산은 흐름 제어문인 조건문, 반복문 등에서 주로 이용한다.

구분연산식연산식연산식결과설명
AND (논리곱)true&& 또는 &truetrue피연산자 모두 true일 경우에만 true
AND (논리곱)true&& 또는 &falsefalse피연산자 모두 true일 경우에만 true
AND (논리곱)false&& 또는 &truefalse피연산자 모두 true일 경우에만 true
AND (논리곱)false&& 또는 &falsefalse피연산자 모두 true일 경우에만 true
OR (논리합)true|| 또는 |truefalse피연산자 중 하나만 true이면 연산결과는 true
OR (논리합)true|| 또는 |falsefalse피연산자 중 하나만 true이면 연산결과는 true
OR (논리합)false|| 또는 |truefalse피연산자 중 하나만 true이면 연산결과는 true
OR (논리합)false|| 또는 |falsefalse피연산자 중 하나만 true이면 연산결과는 true
XOR(배타적 논리합)true|| 또는 |truefalse피연산자가 하나는 true이고 다른하나가 false일 경우에만 true
XOR(배타적 논리합)true|| 또는 |falsetrue피연산자가 하나는 true이고 다른하나가 false일 경우에만 true
XOR(배타적 논리합)false|| 또는 |trueture피연산자가 하나는 true이고 다른하나가 false일 경우에만 true
XOR(배타적 논리합)false|| 또는 |falsefalse피연산자가 하나는 true이고 다른하나가 false일 경우에만 true
NOT(논리 부정)!truefalse피연산자의 논리값을 바꿈
NOT(논리 부정)!falseture피연산자의 논리값을 바꿈

근데 이거 표 어지러우면 true = 🔵, false = 🚨 바꿔서 아래에 만들어둠
마크다운 행, 열 병합 아시는 분 ? 찾아도 안나오던데? 나중에 html로 수정해서 바꿔둠

&&는 피연산자 모두 true일 경우에만 true
||은 피연산자 중 하나만 true이면 true
^는 피연산자가 하나는 true이고 다른 하나가 false일 경우에만 true
!는 피연산자의 논리값을 바꿈
&&는 앞의 피연산자가 false이면 뒤의 피연산자를 평가하지 않고 바로 false산출한다. 그러나 &는 두 피연산자 모두를 평가 후 결과 산출한다. 똑같이 ||와 |도 같은 원리이다.

3.8 비트 논리 연산자

비트 논리 연산자는 bit 단위로 논리 연산을 수행한다. 0과 1이 피연산자가 되므로 2진수 0과 1로 저장되는 정수타입 (byte, short , int, long)만 피연산자가 될 수 있고 부동 소수점 방식으로 저장 되는 실수 타입(float, double)은 피연산자가 될 수 없다.

&는 두비트 모두 1일 경우에만 연산 결과가 1
|는 두 비트 중 하나만 1이면 연산 결과는 1
^는 두 비트 중 하나는 1이고 다른하나가 0일 경우 연산 결과는 1
~는 보수이다.

비트 논리 연산자는 int 타입으로 자동 변환한 후 연산을 수행한다 따라서 연산 결과도 int 타입이 되므로 int 변수에 대입해야 한다.

byte num1 = 45;
byte num2 = 25;
int result = num1 & num2; //byte result = num1 & num2; 는 컴파일 에러

3.9 비트 이동 연산자

비트 이동 연산자는 비트를 좌측 또는 우측으로 밀어서 이동시키는 연산을 수행한다.

3.10 대입 연산자

대입 연산자는 우측 피연산의 값을 좌측 피연산자인 변수에 대입한다.

3.11 삼항(조건) 연산자

삼항 연산자 ( 피연산자 ? 피연산자: 피연산자 )는 총 3개의 피연산자를 가지며 >앞의 피연산자는 boolean 변수 또는 조건식이 오므로 조건 연산자라고도 한다. 이 값이 true이면 : 앞의 피연산자가 선택되고, false이면 콜론 뒤의 피연산자가 선택된다.

3.12 연산의 방향과 우선순위

&&보다는 >,<가 우선순위가 높기 때문에 먼저 연산된다. 우선순위가 같은 연산자들끼리는 대부분 왼쪽에서 오른쪽으로 연산을 수행한다.

100 * 2 /3 % 5  // 200 , 66 , 1 결과값은 1이 나온다.
증감, 부호, 비트, 논리, 대입은 연산 방향이 우측에서 좌측으로 연산한다.
우선 순위를 숙지했더라고 해도 여러가지 연산자가 섞여있다면 혼란스러울 수 있으니 괄호()로 묶는 것을 추천한다.

챕터 1 확인문제

1. 4번

2. 2번

3. 4번

4. 3번

5. 3 > 1 > 2 >

6. 4번

7. 1, 2, 3, 4번

8.

public class Example { 
	public static void main(String[] args) {
    	System.out.println("개발자가 되기 위한 필수 개발 언어 Java");
    }
}

챕터 2 확인문제

1. 4번 , 변수는 초기값 선언 후 읽을 수 있다.

2. 3,6,7번 변수는 숫자시작이 불가, 타입명 사용 불가, $와 _ 만 사용 가능하다.

3. 좌측 순서대로 정수타입 : byte, char, short, int, long // 실수타입 float, double // 논리타입 boolean

4. 타입: int, double // 변수 이름: age, price // 리터럴:10, 3.14

5. 3번 char 타입은 양수만 저장가능하다.

6. 4번 문자열을 char타입으로 변환불가

7. 3번 빈문자는 " " 이렇게 표시. //

8. 3번 변수의 값을 바꾸지는 않는다.

9. 1번 byte + byte는 연산시 int로 변경.

10. 2번 Integer.parseInt이다.

11. 13, 16번 줄 v2 ,v3 선언된 중괄호 안에서만 사용가능.

챕터 3 확인문제

1. 31

2. 가

3. pencils / students , pencils % students

4. value / 100 * 100

5. 1, 2, 3, 4 번

6. true, false

7. Double.isNaN(z)

0개의 댓글

관련 채용 정보