☕ Java

[Java] 자바 기본 내용 정리 || Java Basic Programming

dmaolon 2022. 6. 2. 16:59

1. 자바 시작

- 프로그래밍 언어

기계어(Machine Language) : 이진수 명령어들로 구성된 언어
어셈블리어(Assembly Language) : 기계어의 명령을 니모닉 기호로 일대일 대응시킨 언어
컴퓨터가 이해할 수 있도록 기계어 코드로 변환하는 것은 컴파일(Compile) 과정이다.
[ .java → .class ]
< 개발 편의성에 따라 >
저급 언어 : 기계가 이해할 수 있도록 만들어진 언어
고급 언어 : 개발자가 소스 코드를 작성할 때, 쉽게 이해할 수 있도록 만들어진 언어
< 실행하는 방식에 따라 >
명령형 언어 : ( = 절차형 언어) 명령어들이 순차적으로 실행되는 프로그래밍 방식
객체 지향 언어 : 객체 간의 메시지 통신을 이용한 프로그래밍 방식
 

- 자바 특징

자바 가상 기계(JVM) : 서로 다른 플랫폼에서 자바 프로그램이 실행되도록 동일한 환경 제공
바이트 코드 : 자바 가상 기계에서만 실행되는 기계어

하나의 실행 파일(.exe)로 뭉치는 링크의 과정이 없고, 필요에 따라 클래스 파일을 로딩하고 실행한다.

JDK(Java Development Kit) : 자바 컴파일러 등의 개발 도구 + JRE(Java Run Environment)
JRE : 자바 API + 자바 가상 기계(JVM)
자바 API : 사용하기 위해 이미 만들어둔 자바 클래스 집합

플랫폼 독립성 : 자바 가상 기계(JVM)이 있으면, 어디서나 항상 동일한 실행 결과를 기대할 수 있다. WORA(Write One Run Anywhere)
객체 지향 : 캡슐화, 다형성, 상속을 지원한다.
클래스 파일에는 반드시 하나의 클래스만 들어있고, 오직 한 클래스만 public으로 선언할 수 있다.
서로 관련 있는 클래스를 묶어 패키지로 관리한다.
멀티 스레드 : 다수의 작업을 처리할 수 있도록 다수의 스레드가 동시에 실행할 수 있다.
가비지 컬렉션 : 메모리를 반환하는 기능이 없지만, 가비지 컬렉션을 통해 자동으로 회수된다.
 

2. 자바 기본

- 클래스 & main( ) 메소드

클래스 밖에 어떤 것도 작성해서는 안 된다.
main( )은 반드시 public, static, void 타입으로 선언되어야 한다.
한 클래스에 2개 이상의 main( )을 작성하면 안 된다.
 

- 식별자

목적에 맞는 이름을 붙이는 것이 좋다.
충분히 긴 이름으로 붙여 역할 전달이 쉽도록 한다.
클래스 이름 : 파스칼 표기법 (HelloWorld)
변수, 메서드 이름 : 카멜 표기법 (helloWorld)
상수 이름 : 모두 대문자 (HELLO)
 

- 데이터 타입

기본 타입 (8개) : boolean, char, byte, short, int, long , float, double
레퍼런스 타입 (1개) : 용도에 따라 배열, 클래스, 인터페이스에 대한 레퍼런스
자바에서는 영어, 한글 상관없이 문자 하나는 2바이트의 유니코드로 저장된다.
문자열은 기본 타입에 속하지 않으며, String 클래스 이용한다.
 
리터럴(literal) 이란 프로그램에 직접 표현한 값
    - 정수 리터럴
     ( 0으로 시작 X : 10진수 / 0으로 시작 : 8진수 / 0x로 시작 : 16진수 / 0b로 시작 : 2진수 )
    - 실수 리터럴 (f나 F : float, d나 D : double)
    - 문자 리터럴 (단일 인용부호인 ' ' 혹은 \u유니코드)
    - 특수 문자 리터럴 (\b, \t, \n, \f 등)
    - 논리 리터럴 (true, false만 있다)
 
기본 타입 이외의 리터럴
    - null 리터럴
    - 문자열 리터럴
지역 변수에 var 키워드를 사용하면, 자동으로 변수 타입이 결정된다.
 

- Scanner

import문 사용

import java.util.Scanner;

 

객체 생성

Scanner scanner = new Scanner(System.in);

 

next( ) VS. nextLine( )

공백 없이 문자를 읽을 땐, next( )
공백이 낀 문자열을 읽을 땐, nextLine( )  [ 입력이 없을 경우 "" 빈 문자열 리턴)

 

객체 닫기

scanner.close();

[ 응용 프로그램 전체에 Scanner 객체 하나만 생성하고 공유하는 것이 바람직하다.]
 

- 연산자 우선순위

증산시 관비 논삼대

 

- 조건문

- if ~ else if ~ else
- switch ~ case ~ default (case문의 값은 정수 & 문자 & 문자열 리터럴만 허용, 변수나 식은 X)

 

실습 문제

import java.util.Scanner;

public class BasicExample {
    Scanner sc = new Scanner(System.in);

    void Ex01(){
        System.out.println("---------[Ex01]---------");
        System.out.print("원화를 입력하세요(단위 원)>>");
        int won = sc.nextInt();
        System.out.println(won + "원은 $" + won/1100.0 + "입니다.");
    }

    void Ex02(){
        System.out.println("---------[Ex02]---------");
        System.out.print("2자리수 정수 입력(10~99)>>");
        int num = sc.nextInt();
        int x = num % 10, y = num / 10;
        if (x == y) {
            System.out.println("10의 자리와 1의 자리가 같다.");
        } else {
            System.out.println("10의 자리와 1의 자리가 다르다.");
        }
    }

    void Ex03() {
        System.out.println("---------[Ex03]---------");
        System.out.print("금액을 입력하시오>>");
        int money = sc.nextInt();
        System.out.println("오만원권 " + money / 50000 + "매");
        money %= 50000;
        System.out.println("만원권 " + money / 10000 + "매");
        money %= 10000;
        System.out.println("천원권 " + money / 1000 + "매");
        money %= 1000;
        System.out.println("백원 " + money / 100 + "개");
        money %= 100;
        System.out.println("오십원 " + money / 50 + "개");
        money %= 50;
        System.out.println("십원 " + money / 10 + "개");
        money %= 10;
        System.out.println("일원 " + money / 1 + "개");
    }

    void Ex04() {
        System.out.println("---------[Ex04]---------");
        System.out.print("정수 3개 입력>>");
        int x = sc.nextInt(), y = sc.nextInt(), z = sc.nextInt();
        if (x > y && x < z) {
            System.out.println("중간 값은 " + x);
        } else if (y > x && y < z) {
            System.out.println("중간 값은 " + y);
        } else {
            System.out.println("중간 값은 " + z);
        }
    }

    void Ex05() {
        System.out.println("---------[Ex05]---------");
        System.out.print("정수 3개 입력>>");
        int x = sc.nextInt(), y = sc.nextInt(), z = sc.nextInt();
        if ((x + y > z) && (x + z > y) && (y + z > x)) {
            System.out.println("삼각형이 가능하다.");
        } else {
            System.out.println("삼각형이 되지 않는다.");
        }
    }

    void Ex06() {
        System.out.println("---------[Ex06]---------");
        System.out.print("1~99 사이의 정수를 입력하시오>>");
        int x = sc.nextInt();
        int a = x / 10;
        int b = x % 10;
        if (a == 3 || a == 6 || a == 9) {
            if (b == 3 || b == 6 || b == 9) {
                System.out.println("박수짝짝");
            } else {
                System.out.println("박수짝");
            }
        }else if (b == 3 || b == 6 || b == 9) {
            System.out.println("박수짝");
        } else {
            System.out.println("박수를 치지 않는다.");
        }
    }

    void Ex07() {
        System.out.println("---------[Ex07]---------");
        System.out.print("점 (x,y)의 좌표를 입력하시오>>");
        int x = sc.nextInt(), y = sc.nextInt();
        if ((x >= 100 && x <= 200) && (y >= 100 && y <= 200)) {
            System.out.println("(" + x + "," + y + ")는 사각형 안에 있다.");
        } else {
            System.out.println("(" + x + "," + y + ")는 사각형 안에 없다.");
        }
    }

    public static boolean inRect(int x, int y) {
        if ((x >= 100 && x <= 200) && (y >= 100 && y <= 200)) {
            return true;
        }
        return false;
    }

    void Ex08() {
        System.out.println("---------[Ex08]---------");
        System.out.print("점 (x1,y1)의 좌표를 입력하시오>>");
        int x1 = sc.nextInt(), y1 = sc.nextInt();
        System.out.print("점 (x2,y2)의 좌표를 입력하시오>>");
        int x2 = sc.nextInt(), y2 = sc.nextInt();

        if (inRect(x1, y1) || inRect(x2, y2)) {
            System.out.println("두 직사각형은 충돌한다.");
        } else {
            System.out.println("두 직사각형은 충동하지 않는다.");
        }
    }

    void Ex09() {
        System.out.println("---------[Ex09]---------");
        System.out.print("원의 중심과 반지름 입력>>");
        double x = sc.nextDouble(), y = sc.nextDouble(), r = sc.nextDouble();
        System.out.print("점 입력>>");
        double a = sc.nextDouble(), b = sc.nextDouble();
        // 원 중심과 입력된 점의 거리
        double distance = Math.sqrt((x - a)*(x - a) + (y - b) * (y - b));
        if (distance > r) {
            System.out.println("(" + a + "," + b + ")는 원 안에 없다.");
        } else {
            System.out.println("(" + a + "," + b + ")는 원 안에 있다.");
        }
    }

    void Ex10() {
        System.out.println("---------[Ex10]---------");
        System.out.print("첫번째 원의 중심과 반지름 입력 >>");
        double x1 = sc.nextDouble(), y1 = sc.nextDouble(), r1 = sc.nextDouble();
        System.out.print("두번째 원의 중심과 반지름 입력 >>");
        double x2 = sc.nextDouble(), y2 = sc.nextDouble(), r2 = sc.nextDouble();

        double distance = Math.sqrt((x1 - x2) *(x1 - x2) + (y1 - y2) * (y1 - y2));
        if (distance > (r1 + r2)) {
            System.out.println("두 원은 겹치지 않는다.");
        } else {
            System.out.println("두 원은 서로 겹친다.");
        }
    }

    void Ex11_1() {
        System.out.println("---------[Ex11_1]---------");
        System.out.print("달을 입력(1~12)>>");
        int x = sc.nextInt();
        if (x >= 3 && x <= 5) {
            System.out.println("봄");
        } else if (x >= 6 && x <= 8) {
            System.out.println("여름");
        } else if (x >= 9 && x <= 11) {
            System.out.println("가을");
        } else if (x == 12 || x == 1) {
            System.out.println("겨울");
        } else {
            System.out.println("잘못입력");
        }
    }

    void Ex11_2() {
        System.out.println("---------[Ex11_2]---------");
        System.out.print("달을 입력(1~12)>>");
        int x = sc.nextInt();
        switch (x) {
            case 3:
            case 4:
            case 5:
                System.out.println("봄");
                break;
            case 6:
            case 7:
            case 8:
                System.out.println("여름");
                break;
            case 9:
            case 10:
            case 11:
                System.out.println("가을");
                break;
            case 12:
            case 1:
                System.out.println("겨울");
                break;
            default:
                System.out.println("잘못입력");
        }
    }

    void Ex12_1() {
        System.out.println("---------[Ex12_1]---------");
        System.out.print("연산>>");
        double a = sc.nextDouble();
        String x = sc.next();
        double b = sc.nextDouble();

        if (x.equals("+")) {
            System.out.println(a + x + b + "의 계산 결과는 " + (a+b));
        } else if (x.equals("-")) {
            System.out.println(a + x + b + "의 계산 결과는 " + (a-b));
        } else if (x.equals("*")) {
            System.out.println(a + x + b + "의 계산 결과는 " + (a*b));
        } else if (x.equals("/")) {
            if (b == 0) {
                System.out.println("0으로 나눌 수 없다.");
            } else {
                System.out.println(a + x + b + "의 계산 결과는 " + (a/b));
            }
        }
    }

    void Ex12_2() {
        System.out.println("---------[Ex12_2]---------");
        System.out.print("연산>>");
        double a = sc.nextDouble();
        String x = sc.next();
        double b = sc.nextDouble();

        switch (x) {
            case "+":
                System.out.println(a + x + b + "의 계산 결과는 " + (a+b));
                break;
            case "-":
                System.out.println(a + x + b + "의 계산 결과는 " + (a-b));
                break;
            case "*":
                System.out.println(a + x + b + "의 계산 결과는 " + (a*b));
                break;
            case "/":
                if (b == 0) {
                    System.out.println("0으로 나눌 수 없다.");
                } else {
                    System.out.println(a + x + b + "의 계산 결과는 " + (a/b));
                }
                break;
        }
    }

    public static void main(String[] args) {
        BasicExample ex = new BasicExample();
        ex.Ex01();
            }
}

 
 
참고) 명품 자바 프로그래밍 1 ~ 2장  + 실습 문제
 

명품 JAVA Programming(개정4판)

명품 자바를 사랑해주시는 많은 교수님들과 독자들께 감사드립니다. 2017년 7월에 개정3판이 나오고, 두 달도 지나지 않아 Java 9가 출시되었습니다. 그리고 급기야 올해 3월에는 Java 10이 출시되었

www.booksr.co.kr

 

반응형