JAVA 개인공부 (1)

쭈오기단·2023년 2월 13일
  • 컴파일 : 인간이 이해하기 쉬운 언어를 기계어로 번역하는 과정
  • 컴파일러 : 컴파일을 하는 프로그램 (JVM) 운영체제에 번역시켜서 전달한다.
  • 바이트 코드 : 0과 1로 이루어진 코드, 컴퓨터가 이해할 수 있다.

JVM을 거쳐서 가기 때문에 JAVA는 한번만 설치하면 된다.
원래는 OS마다 다른 '컴파일러'가 필요하지만. JAVA는 JVM이 0과 1을 OS맞게 번역해 준다.
이 JVM은 인기가 상당해서 JAVA 외에 다른 언어에도 사용하고 있다.

JVM은 똑같은 JAVA 바이트 코드를 OS마다 다르게 해석해주는 친구다.

JDK : Java Development Kit / 자바 개발 도구 : 개발을 위한 도구이다. 컴파일러, 디버그 도구등이 포함되어 있다.
JRE : Java Runtime Environment / 자바 실행 환경 : 자바 프로그램 실행에 필요한 라이브러리 파일 등이 들어있다. JVM실행 환경을 구현.
JVM : Java Virtual Machine / 자바 가상 기계(자바 가상 머신), OS별로 존재한다. 바이너리 코드를 읽고 검즈하고 실행한다. 자바 프로그램이 실행되는 가상 컴퓨터라고 생각하자.

JDK를 설치하면 JRE와 JVM이 같이 설치된다.

실행과정
1. 소스파일 작성
2. jdk가 소스파일을 컴파일(기계어로 번역 : 바이트 코드)

변수의 선언
선언을 하는 이유 : 메모리가 값을 저장할 공간을 만들기 위해서
변수타임 변수이름:

클라스는 어디에 속하는가?

문제1.
프로젝트 폴더에 우클릭 -> New -> Java Class 가 보이지 않을 때 해결방법
해당 위치가 프로젝트 root로 지정이 되어있지 않아서 생기는 문제이다.
우클릭 -> Mark Directory as -> Sources Root 클릭하면 해결 된다.

변수

변수의 초기화

public class myVariable1_2 {
    public static void main(String[] args) {
        boolean flag = false; //참,거짓으로 저장 가능
        char grade = 'A'; //문자로 저장가능
        byte val = 127; // 숫자 127까지 저장 가능
        short sval = 128; // 128 이상의 숫자
        int num = 32768;
        long price = 2_147_483_648L;
        float tax = 3.14f;
        double score = 3.14159265358979;

        System.out.println(flag);
        System.out.println(grade);
        System.out.println(val);
        System.out.println(sval);
        System.out.println(num);
        System.out.println(price);
        System.out.println(tax);
        System.out.println(score);

        //false
        //A
        //127
        //128
        //32768
        //2147483648
        //3.14
        //3.14159265358979

    }
}

변수의 값읽기

public class myVariable1_3 {
    // public static void main(String[]) args) 아래와 뭐가 다른지 모르겠는데 main에 함수표시가 안뜬다.
    public static void main(String[] args) {
        int year, age = 23;

        year = age + 2000;
            System.out.println("year = " + year); //결과 2023

        age = age + 1;
        System.out.println(age);
        System.out.println(year);

        //시작할때 age는 23이었지만 끝날때 age는 24가 되었다. 이 말은 age에 부여된 데이터 공간에 23 대신 24가 들어갔다는 말인가
        //age값이 바뀌었는데 어째서 year에 영향을 주지 않는 걸까? 위치와 상관없이 year의 값은 2024가 나온다.
        //그렇다면 데이터가 바뀐 것은 아니라는 의미?

        //year = 2023
        //24
        //2023


    }
}

변수의 종류

public class myVariable1_4 {
    static int classVal = 100;
    int instanceVal = 200;

    public static void main(String[] args) {
        int num; //지역변수라고 한다. 무슨 의미?
        num = 300;
        System.out.println("int = " + num);

        //인스턴스 변수
        myVariable1_4 instance = new myVariable1_4();
        System.out.println("instanceVal = " + instance.instanceVal);

        //클래스변수
        System.out.println("classVal = " + classVal);
        System.out.println("Main.classVal = " + myVariable1_4.classVal);

        //int = 300
        //instanceVal = 200
        //classVal = 100
        //Main.classVal = 100

    }
}

과제

연습문제 2-4

//2-4. 다음 중 변수를 잘못 초기화 한 것은?
        //초기화란? 최초 변수의 값을 정하는 것
        byte b = 256;
        //byte = 8 bit 2^7=128까지 표기 가능. 초기화 할 수 없음
        char c = '';
        //char는 16bit 2^16=65,536.
        // ''안에는 문자가 들어가야 한다. 만약 공백을 표기하고 싶었다면 ""이들어갔어야함
        //문자와 문자열의 차이는 ?
        char answer = 'no';
        //'n';이나 'o';가 들어가는 것은 가능
        //"no";로 표기해야한다.
        float f = 3.14
        // float 32bit(4byte) 까지 표현 가능
        //;로 마무리가 되지 않아서 오류가 날 것 같다

        double d = 1.4e3f;
        //double 은 64bit까지 가능(8byte)
        // 어떤 숫자가 도출되는지 모르겠다.


        System.out.println(d); // 1400.0
double d = 1.4e3f; 
계산 어떻게 하는지 알아보기

연습문제 2-7

//2-7. 다음 문장들의 출력 결과를 적으세요. 오류가 있는 문장의 경우, '오류' 라고 적으세요.
        System.out.println("1" + "2");
        //출력 : 12 (단순 문자열의 연속) 정답
        
        System.out.println(true+"");
        //오류 : 속성이 다르다. 불리언과 문자.
        //true도 속성이기 때문에 공백란과 합쳐졌을 때는 그냥 true로 뜬다.
        
         System.out.println('A' + 'B');
        //아스키코드 A와 B의 합(대문자) : 65+66 =131
        
         System.out.println('1' + 2);
        //아스키코드 1(49)의 값에 +2 = 67
        
        System.out.println('1' + '2');
        //아스키코드 1(49),2(50)의 합 = 99

System.out.println('J' +"ava");
        //아스키코드 J값에 문자열의 합. 기본형과 참조형의 합은 어떻게 나오는거지?
        //74ava?
        //두개의 값중에 더 큰 값으로 통일된다. 문자는 char 2byte 참조형은 4byte이므로 참조형으로 통일
        //근데 왜 JAVA가 나오는거지?
System.out.println(true + null);
        //true (null
        //true가 뜰 줄 알았는데 오류가 나왔다. null은 아무것도 없음 아닌가. 

연습문제 2-8

public static void main(String[] args) {

        //2-8. 아래는 변수 x, y, z의 값을 서로 바꾸는 예제이다. 결과와 같이 출력되도록 코드를 넣으세요.
        int x = 1;
        int y = 2;
        int z = 3;

        int tmp = x;
        x = y;
        y = z;
        z = tmp;
       /*
          알맞은 코드를 넣어 완성하세요.
       */
        System.out.println("x="+x);
        System.out.println("y="+y);
        System.out.println("z="+z);

            }

public static void main(String[] args) {

        byte b = 10;
        char ch = 'A';
        int i = 100;
        long l = 1000L;
//3-1. 다음 중 형변환을 생략할 수 있는 것은? (모두 고르시오)
        b = (byte)i;
        //형 변환 생략할 수 없음.
        //변수 b는 byte타입의 10(2진법), i는 int상수로 100이기 때문에 범위가 다름

        ch = (char)b;
        //형 변환 생략 불가
        //ch는 char이고 b는 byte. 이게 맞나? 아리송

        short s = (short)ch;
        //형 변환 생략 불가
        //short와 char는 같은 2비트이지만 범위가 다르다. 서로 끼워 넣을 수 없다.

        float f = (short)ch;
        //생략 가능
        //boolean,byte(1 bit) < short < char (2 bit) < int < float(4 bit) < long,double (8 bit)

        i = (int)ch;
        //형 변환 생략 가능
        //int는 char보다 범위가 크다.
        //다이어그램으로 그려서 생각하면 더 쉬울것 같다.


    }

범위 크기 순서 생각하면서 정리하기

boolean,byte(1 bit) < short < char (2 bit) < int < float(4 bit) < long,double (8 bit)

산술자

char ch = '2';
        System.out.println((int)ch);
        //숫자 2로 바꾸고 싶다면 - '0'을 하면된다. 왜? 문자'0'이 48이기 때문이다.
        //개발자처럼 사고 하려면 아키텍 표기에 익숙해질 필요가 있다. 
round() : 실수를 소수점 첫 째자리에서 반올림한 정수를 반환합니다.
ceil() : 올림값을 double 형으로 반환합니다.
floor() : 내림값을 double 형으로 반환합니다.
abs() : int, double 기본형 모두 사용 가능하며 절대값을 얻습니다.


long result = Math.round(3.45678);
        System.out.println(result);

소수점 4째 자리에서 반올림한 값을 구하라!
double pi = 3.1456789;
        pi * 1000 = 3145.6789
        Math.round(3145.6789) = 3146
        3145 / 1000 = 3.146
double chortPi = Math.round(pi * 1000) / 1000.0;
        System.out.println(chortPi);

double pi2 = 3.141592;
         pi2 * 1000 = 3141.592
        (int)3141.592

System.out.println((int) (pi2 * 1000)/1000.0);
System.out.println((int) ((pi2 * 1000)/1000.0)); //값은 3
// 위에와 뭐가 다른가?

다음의 연산결과와 그 이유를 적으세요

int x = 2;
        int y = 5;
        char c = 'A'; // 'A'의 문자코드는 65

System.out.println(y >= 5 || x < 0 && x > 2); //true
//        System.out.println(y >= 5); //true
//        System.out.println(x < 0 ); //false
//        System.out.println(x > 2); //false

System.out.println(y += 10 - x++);
//y에 10을 더해서 y에 다시 넣으면 15가 된다. 그 상태에서 x(2)를 빼면 13이 된다.

System.out.println(x += 2);
//x에 2를 더한값을 x에 넣으면 4가 된다.

System.out.println(!('A' <= c && c <= 'Z'));
//ture and true 는 ture 그 상태에서 !로 반대가되면 false
System.out.println('C' - c);
//피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
//둘 다 int보다 작기 때문에 int로 변환된다.


System.out.println('5' - '0');
//int로 변환되어 계산하면 그대로 5가 나온다.

System.out.println(c + 1);
//c가 int로 변환되어 65가되고 +1하면 66

System.out.println(++c);
//단항 연산자는 형변환을 하지 않는다.
//실제로 변수 c에 저장된 값은 문자코드 65이므로 +1을하면 66이 되고
// 66은 문자코드에서 'B'가 된다.

System.out.println(c++);
//후위형은 변수가 출력된 후에 값이 증가하므로 값이 변하지 않은것으로 보인다.
System.out.println(c++);
System.out.println(c);
//하지만 후위형 이후에 c값을 출력해보면 값이 변한것을 알 수 있다.

3-3. 아래는 변수의 num 값 중에서 백의 자리 이하를 버리는 코드이다. 만일 변수 num의 값이 '456'이라면 '400'이 되고, '111'이라면 '100'이 된다.

알맞은 코드를 넣으시오.

int num = 456;
System.out.println(num/100.0); //4.56
        //Math.round()함수 이용하기
        //4.56 이 값에서 소숫점을 버리고 다시 *100을 하면 111이 되더라고 같은 값이 나올것이다.
        //근데 그 방법을 모르겠네
        //바보같은 고민이었다

System.out.println(num/100*100);
        //단순하게 그냥 나눗셈연산자를 하면 바로 버림을 할 수 있다. 그 값에서 *100을 하면 된다.
        //복잡하게 생각하지 않기!

3-6. 아래는 화씨(Fahrenheit)를 섭씨(Celcius)로 변환하는 코드이다.변환 공식이 'C = 5/9*(F-32)'라고 할 때, 빈 칸에 알맞은 코드를 넣으시오. 단, 변환값은 소수점 셋째자리에서 반올림하며, Math.round() 함수를 사용하지 않고 처리할 것!

//3-6. 아래는 화씨(Fahrenheit)를 섭씨(Celcius)로 변환하는 코드이다.
//변환 공식이 'C = 5/9*(F-32)'라고 할 때, 빈 칸에 알맞은 코드를 넣으시오.
// 단, 변환값은 소수점 셋째자리에서 반올림하며, Math.round() 함수를 사용하지 않고 처리할 것!
        int fahrenheit = 100;
        float celcius = (/*빈 칸*/);

        System.out.println("Fahrenheit:"+fahrenheit);
        System.out.println("Celcius:"+celcius);
//예상 결과 : Fahrenheit:100, Celcius:37.78
        //이건 도저히 못풀겠다.
[정답] (int)((5/9f * (fahrenheit - 32))*100 + 0.5) / 100f
다른 표현 방식
float celcius = (int)(((((float)fahrenheit-32)*5/9)*100)+0.5f)/100f;

[해설] 먼저 화씨를 섭씨로 바꾸는 공식은 '5/9f * (fahrenheit - 32)'이다. 5/9의 결과 는 0이기 때문에 두 피연산자 중 어느 한 쪽을 반드시 float나 double로 해야만 실수형태 의 결과를 얻을 수 있다. 그래서 정수형 리터럴인 9대신 float타입의 리터럴인 9f를 사용 하였다. 소수점 셋째자리에서 반올림을 하려면 다음의 과정을 거쳐야한다.

```java
profile
나는야 해적이 될거야

0개의 댓글