2장

자바 프로그램 기본 구조

  • 클래스
    객체지향언어에서 프로그램을 개발하는 단위
    적어도 하나의 클래스는 있어야 함
    자바의 소스파일은 클래스 이름과 연관됨(Hello 클래스 생성 -> Hello.java 소스파일 생성)
    클래스 이름은 대문자로 시작하는 것이 관례
    클래스 내부에는 여러개의 메소드가 포함됨
  • 메서드
    수행할 작업을 나열한 코드의 모임
    자바 애플리케이션은 main() 메서드를 포함하는 클래스가 반드시 있어야 함
    따라서 main()메서드를 포함하는 클래스가 반드시 있어야 함
  • 실행문
    작업을 지시하는 번수선언, 값 저장, 메서드 호출 등의 코드화면에 문자, 숫자 등을 출력하는 실행문
  • System.out.println("안녕");
  • 주석문
    행주석 //
    범위 주석 /* */
    문서 주석 /** */

식별자

  • 규칙
    • 프로그램에서 사용하는 변수, 메서드, 클래스, 상수는 이름으로 구분하는데 이것을 식별자라고 함
    • 문자, 언더바(_),$로 시작해야한다. 한글도 가능하며, 영문자는 대,소문자를 구분한다.
    • +,- 등 연산자를 포함하면 안된다.
    • 자바 키워드를 사용하면 안된다
    • 길이에 제한이 없다.
  • 자바 키워드
    • 데이터타입 : byte , char, short, int, long, float, double, boolean
    • 접근 지정자 : private, public, protected
    • 제어문 : if, else, for, while, do, break, continue, switch, case,
    • 클래스와 객체 : class, interface, enum, extends, implements, new, this, super, instanceof, null
    • 예외처리 : try, catch, finally, throw, throws
    • 기타 : abstract, assert, const, default, false, final, import, native, package, return, static, strictfp, synchronized, transient, true, void, volatile
  • 관례
    • 변수와 메서드는 모두 소문자로 표기, 단 복합단어일 경우, 두번째 단어부터 단어의 첫 자만 대문자로 표기. (int a, int year, int thisYear, isEmpty)
    • 클래스와 인터페이스는 첫 자만 대문자로 표기하고 나머지는 소문자로 표기, 단 복합단어일 경우, 두 번째 단어부터 단어의 첫 자만 대문자로 표기( HelloDemo, MyRunnable)
    • 상수는 전체를 대문자로 표기, 단 복합단어일 때는 단어를 언더바(_)로 연결 ( NUMBER_ONE, PI)

변수

  • 의미
    • 프로그램은 기억공간에 데이터를 보관하고, 각 기억공간을 변수 Variable로 구분
    • 변수는 데이터를 담는 상자와 같은 것으로, 종류가 다양한데, 이를 구분하려고 데이터 타입을 사용
    • 데이터 타입에 따라 처리가 가능한 값, 수행할 수 있는 명령, 데이터의미, 저장하는 방식이 달라짐.

데이터타입

  • 의미
    • 값과 값을 다룰 수 있는 연산의 집합을 의미
  • 종류

  • 기억공간 크기 및 기본 값

변수

  • 리터럴
    • 프로그램 내부에서 값을 정의해 변수를 초기화하는데, 그 값을 리터럴 이라고 함
  • 정수
int fifteen = 15; // 10진수
byte fifteen = 0b1111; // 2진수 15
short fifteen = 017; // 8진수 15
int fifteen = 0xF; // 16진수 15
long lightSpeed = 300000L; // L으로 long타입임을 명시해줘야함
  • 실수
double half = 0.5; // 일반 표기법
double half = 5E-1; // 지수 표기법으로 5 * 10^-1 를 의미 
float pi = 3.14195; // 오류임!!!!!!!!
float pi = 3.14195F; // F는 float타입임을 명시
double pi = 3.14195;
  • 문자
char c = 'A'; // 문자
char c =  65; // 일종의 정수타입이기 때문에, 65 대입가능
char c = '\u0041'; // 유니코드 값으로 대입
char c = "A"; // "A"는 문자가 아니라 문자열이므로 오류가 남
  • 변수
package chap02;

public class CharBoolDemo {
    public static void main(String[] args) {
        char ga1 = '가';
        char ga2 = '\uac00';

        boolean cham = true;
        boolean geojit = false;

        System.out.println(ga1);
        System.out.println((int) ga1);
        System.out.println(++ga1); // 각
        System.out.println(ga1++); // 각 전위연산 
        System.out.println(ga1); // 갂

        System.out.println(ga2); // 가
        System.out.println(++ga2); // 각
        System.out.println(cham + "가 아니면" + geojit + "입니다."); // True가 아니면 False 입니다.

    }
}

여기서 또 전위 후위 연산자가 나온다.

n++ : n을 쓰고 , +1 연산을 하란 의미
++n : +1을 하고, n을 쓰라는 의미

  • 변수 사용
int weight; // 정수타입의 weight 변수 선언
double x, y, z; // 3개의 변수를 ,로 연결해 선언

weight = 100; // weight변수를 100으로 초기화
x = 1.1; // x 변수를 1.1 로 초기화
  • var 예약어
    • 자바 10부터 지원
    • 초깃값을 통하여 데이터타입 추론가능
    • 키워드가 아니어서 식별자로 사용가능
package chap02;

public class VarDemo {
    public static void main(String[] args) {
        int var = 1; // 키워드로 쓰이는 var도 가능
//        var x = 1;

//        var x = 1, y = 2, z = 3 // 한번에 여러개의 변수를 추론할 수 없음

        var x = 1;
        var y = 3;
        var z = 4; // 한번에 하나씩 추론하고, x y z 는 int type
        var a = 1.1; // double타입
//        var str = null; // null은 추론할 수 없음

        int b = 1, c = 2, d = 2; // 타입을 명시하면 한번에 여러개 선언과 초기화 가능

//        var oops; // 초기화랑 같이 안하면 못씀
//        oops= 1;

    }
}
  • 상수
    • 프로그램 실행 중 변경할 수 없는 데이터를 담는 변수
    • 예를들어 원주율 값이나 빛의 속도 등
    • 상수 이름은 변수와 구분하려고 모두 대문자로 표기
    • 반드시 final 키워드로 지정

// 별도 선언 및 초기화
final double PI;
PI = 3.14195;

//동시에 선언 및 초기화  
final double PI = 3.14195;
  • 타입 변환
package chap02;

public class TypeCasting {  
    public static void main(String\[\] args) {  
    // 자동 타입변환  
    double d1 = 5 \* 3.14; // 15.70000000001 int인 1이 타입캐스팅됨  
    double d2 = 1; // 1.0 int인 1이 타입캐스팅됨  
    System.out.println(d1);  
    System.out.println(d2);

    // 강제 타입변환
    // double 의 3.14를 float로 형변환해 f에 3.14F 저장
    float f = (float)3.14;

    // int의 300을 byte로 형 변환하면 데이터 손실 발생
    byte b = (byte) 600; // byte는 -128~ 127까지 표현이라 데이터가 손실됨

    // double 의 3.14를 byte로 형변환하면 데이터가 손실되고 3만 저장
    byte x = (byte) 3.14;

    // float의 3.14를 double 로 형 변환하면 데이터 손실 없이 저장
    double d = (double)3.14f;
    }
}

타입변환 연습

package chap02;

public class CastDemo {  
public static void main(String\[\] args) {  
int i;  
double d;  
byte b;

    i = 7 / 4; // 1 int 7 나누기 int 4는 int 1
    System.out.println(i);
    d = 7 / 4; // 1.0 int 7 나누기 int 4는 int 1
    System.out.println(d);
    d = 7 / (double) 4; // int 7(자동캐스팅으로 7.0됨) 나누기 double 4.0은 double 1.75)
    System.out.println(d);

    // i = 7 / (double) 4; // 결과는 double 1.75인데 얘는 int 타입 변수에 저장할 수 없음

    i = 300;
    if (i < Byte.MIN_VALUE || i > Byte.MAX_VALUE)
       System.out.println("byte 타입으로 변환할 수 없습니다.");
    else
        b = (byte) i;
    }

}

기본 입출력

  • 화면에 데이터 출력
    • println() : 내용을 출력한 뒤, 행을 바꿈
    • print() : 내용을 출력만 하고 행은 안 바꿈
    • printf() : 포맷을 지정해서 출력한다.
  • printf() 형식

System.out.printf("포맷 명시자", 데이터, 데이터, ...);


int x = 5;  
double pi = 3.14;

System.out.printf("x = %d and pi = %f\\n", x, pi);
  • printf()의 포맷과 실행결과

키보드로 데이터 입력

  • 프로그램으 첫 행에 다음을 추가해 Scanner 클래스의 경로이름을 컴파일러에게 알린다.
inport java.util.Scanner;
  • 키보드로 데이터를 입력 받기 위해 System.in 객체와 연결된 Scanner 객체를 생성한다.
Scanner in = new Scanner(System.in);

Scanner 클래스가 제공하는 다양한 메서드를 이용해 키보드로 데이터를 입력 받는다.

int x = in.nextInt(); // 정수를 읽어 변수 x에 대입한다.
  • Scanner 클래스가 제공하는 데이터 입력 메서드

연산자

  • 산술연산자 사용시 주의할 점
    • 피연산자의 데이터타입에 따라 결과값이 다른데 , 연산할 두 피연산자의 데이터타입이 다르면 큰 범위의 타입으로 일치시킨 후 연산 수행
    • 논라 타입을 제외한 기초 타입을 피 연산자로 사용, 문자열과 덧셈을 하는 데이터는 먼저 문자열로 변환 한 후 서로 연결

비트, 시프트 연산자

  • 비트연산자와 시프트 얀산자는 정수타입에만 사용
  • 비트 단위로 연산을 수행
  • 비트 연산자의 종류
    • & : 두 비트가 모두 1일때만 1이며 나머지는 0
    • | : 두 비트가 모두 0일때만 0이며 나머지는 1
    • ^ : 두 비트가 서로 다를 때는 1, 동일할 때는 0
    • ~ : 1을 0으로 0을 1로 바꾼다.
  • 시프트 연산자 종류
    • << : a의 모든 비트를 왼쪽으로 b비트만큼 이동하며, 이동할 때 마다 최하위 비트를 0으로 채운다. 곱셈효과가 나타나기때문에 산술적 왼쪽 시프트라고 한다.
    • >> : a의 모든 비트를 오른쪽으로 b비트만큼 이동하며, 이동할 때 마다 최상위 비트와 동일한 비트로 채운다(1이면 1로 채움) 나눗셈 효과가 나타나기 때문에 산술적 오른쪽 시프트라고한다.
    • >>> : a의 모든 비트를 오른쪽으로 b비트만큼 이동하며, 이동할 때 마다 최상위 비트를 0으로 채운다. 산술적 효과가 없기때문에, 논리적 오른쪽 비트라고 한다.

대입연산자

  • 대입연산자는 오른쪽에 있는 연산식의 결과 값을 왼쪽에 있는 변수에 대입
  • int weight = 50; weight = weight + 10;

복합 대입 연산자 연습

package chap02;

public class AssignmnetDemo {
    public static void main(String[] args) {
        int value = 1;
        value += 1;
        System.out.println("값 : " + value);
        value -= 1;
        System.out.println("값 : " + value);
        value <<= 3;
        System.out.println("값 : " + value);
        value /= 8;
        System.out.println("값 : " + value);

    }
}

연습문제 2-7

package chap02;

import java.util.Scanner;

public class Practice2_7 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("0~999 사이의 숫자를 입력하세요 : ");
        int i = in.nextInt();
        if (i > 999 || i < 0)
            System.out.println("잘못된 입력입니다.");
        else {
            int a, b, c, d;
            a = i / 100;
            b = (i - a * 100) / 10;
            c = i % 10;
            d = a + b + c;
            // 입력이 194 라면
            System.out.println("각자리 수의 합 : " + a + b + c); // 실행결과 194 : 왜냐 a b c를 각각 받았기 때문!!! 
            System.out.printf("각자리 수의 합 : %d \n", a + b + c); // 실행결과 : 14
            System.out.println("각자리 수의 합 : " + d); // 실행결과 : 14

        }
    }
}

증감 연산자

그렇다. 올게 왔다. 내가 그토록 헷갈리던 증감연산자

++ : 1을 더함
-- : 1을 뺌
++x : 연산 전 x값 1증가
x++ : 연산 하고 x값 1증가

--x : 연산 전 x 값 1 감소
x-- : 연산 하고 x값 1 감소

package chap02;

public class SignIncrementDemo {
    public static void main(String[] args) {
        int plusOne = 1;
        int minusOne = -plusOne;
        System.out.println("plusOne은 " + plusOne + "입니다.");
        System.out.println("minusOne은 " + minusOne + "입니다.");

        int x = 1, y = 1;
        System.out.println("x = " + x + ", ++x = " + ++x); // x = 1 , ++x = 2
        System.out.println("y = " + y + ", y++ = " + y++); // y = 1 , y++ = 1
        System.out.println("x = " + x + ", y =" + y); // x = 2. y = 2

    }
}

조건 연산자

  • 조건 연산자는 조건식이 true면 연산식1 의 값이 되고, false면 연산식 2의 값이 된다.
조건식 ? 연산식1 : 연산식2

로 구성

package chap02;

public class TernaryOperatorDemo {
    public static void main(String[] args) {
        int x = 1;
        int y;
        y = (x == 1) ? 10 : 20; // True이니 연산식 1 실행
        System.out.println(y); // 실행결과 : 10
        y = (x > 1) ? x++ : x + 20; // False이니 연산식 2 실행
        System.out.println(x); // 실행결과 : 1
        System.out.println(y); // 실행결과 : 21
    }
}

실습문제 2-8

package chap02;

import java.util.Scanner;

public class Practice2_8 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int a, b, c;
        System.out.print("전공 이수 학점 : ");
        a = in.nextInt();
        System.out.print("교양 이수 학점 : ");
        b = in.nextInt();
        System.out.print("일반 이수 학점 : ");
        c = in.nextInt();

        if ((a >= 70) && (b >= 30 && c >= 30) || (b + c >= 80))
            System.out.println("졸업 가능");
        else
            System.out.println("졸업 불가");
    }
}

연산 순위다. 하다보면 자연스럽게 익혀지겠지만. 

연산 순서 연습

package chap02;

public class OperatorPrecedenceDemo {
    public static void main(String[] args) {
        int x = 5;
        int y = 10;
        int z = ++x * y--;
        System.out.printf("%d\t%d\t%d\n", x, y, z); // 실행결과 : 6 10 60
        System.out.printf("%d\t%d\t%d\n", x, y, z); // 실행결과 : 6 10 60

        int year = 2020;
        System.out.println(year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
        // 연산 순서 : % 하고나서 연산 끝나면 ==와 != 로 논리따짐 그러고 && 먼저 하고 || 나중에 함
    }
}

'TIL > [객체지향 프로그래밍] TIL' 카테고리의 다른 글

TIL (22.04.17) 시험범위 정리 3장  (0) 2022.04.17
TIL (22.04.14)  (0) 2022.04.17
TIL (22.04.16) 시험 범위 정리 1장  (0) 2022.04.16
TIL (22.04.13)  (0) 2022.04.13
TIL (22.04.08)  (0) 2022.04.08