100일 챌린지/빅데이터기반 인공지능 융합 서비스 개발자

Day 03 - java의 문법

ksyke 2024. 7. 24. 14:16

목차

    자바의 소스 코드는 .java이고 class로 구성되어 있다.

    여기서 class는 여러 개를 생성할 수 있다.
    여러개의 클래스로 소스 코드를 만들면 컴파일 시 여러 개의 파일이 만들어 진다. (이때 만들어진 컴파일 파일 이름은 클래스명을 따라 생성된다.) 하지만 하나의 소스 코드에 하나의 클래스를 생성하는 것을 추천한다.

    class의 기본 구성 요소

    클래스의 기본 구성 요소에는 메서드, 필드, 생성자가 있다.


    메서드

    메모리에 대하여

    • 자바는 메모리 영역을 클래스, 스택, 힙으로 나눠서 관리한다.
    클래스 영역
    • core: 클래스 영역에는 자바를 실행하기 위해 핵심적인 숨겨진 부분이 있다.
    • 상수 영역
    • static 영역
    스택 영역
    • 홈페이지 뒤로가기 버튼과 같이 FirstInLastOut 구조로 실행된다.
    • main 메서드가 제일 먼저 실행되고 그 다음 function들이 실행됐다 종료되는 방식으로 실행된다.
    • 객체 생성 (non-static 메서드를 사용할 때 생성하는 객체가 만들어지는 공간)
    • garbage collection의 관리 영역

    static 메서드

    public static 리턴타입 메서드명(매개변수){실행코드;}

    class Ex02 {
        public static void main(String[] args) {
            System.out.println("시작");
    
            func01(2);
            func01(9);
    
            System.out.println("종료");
        }
        public static void func01(int dan) {
            System.out.println("구구단 " + dan + "단 출력");
            for(int i=2; i<10; i++){
                System.out.println(dan + " x " + i + " = " + dan*i);
            }
            System.out.println();
        }
    }
    • main메서드는 자바가 실행될때 자동으로 호출되어지는 메서드라 이름을 수정하거나 지울 수 없다.
    • 메서드명으로 키워드는 사용하지 못하고 문자로 시작되어야 한다.
      • 숫자x,
      • 대문자로 시작되는 메서드명은 클래스로 오인될 수 있기 때문에 소문자로 시작하는게 좋다.
      • 또한 특수문자 _, $는 사용할 수 있지만 다른 기능과 오인될 수 있기 때문에 사용하지 않는 걸 추천
      • camelCase를 사용하여 작성된다.
    • 리턴타입
      • 호출할 값의 형을 적는다.
      • 리턴값이 없을 때는 void라 적는다.
      • return;이 소스 코드에 명시적으로 존재하지 않을 때는 컴파일 과정에서 자동으로 생성된다.
    public static void main(String[] args) { 
        System.out.println("시작"); 
        func01(2); System.out.println("종료"); 
    } 
    public static void func01(int dan) { 
        System.out.println("구구단 " + dan + "단 출력"); 
        for(int i=2; i<10; i++){ 
            System.out.println(dan + " x " + i + " = " + dan*i); 
            if(i==2)return; 
        } 
        System.out.println(); 
    }
    • 메서드의 호출
      • 메서드명();
      • 메서드명(매개변수값);
      • 메서드명(매개변수값1, 매개변수값2, ...);
    • 매개변수 (=parameter, 인자, arguments)
      • (타입 변수명1, 타입 변수명2, ...);
    • 변수의 선언
      • 변수의 생명 주기는 그 변수가 생성된 중괄호{}가 시작된 시점에서 중괄호가 닫힐때까지 이다.
      • 두번째 a는 세번째 a가 호출되기 전에 이미 닫혔기 때문에 다음과 같이 출력된다.non-static 메서드
      • /// main before a = 1111 /// func01 a = 3333 /// main after a = 1111
    public static void main(String[] args) { 
        int a = 1111; 
        System.out.println("main before a = " + a); 
        func01(); 
        System.out.println("main after a = " + a); 
    } 
    public static void func01() { 
        int a = 3333; 
        System.out.println("func01 a = " + a); 
        }

    non-static 메서드

    static과 달리 non-static은 메모리에 미리 할당된 공간이 없기 때문에 먼저 객체생성을 한 후 선언해서 사용한다.

    class Ex04 {
        public static void main(String[] args) {
            Ex04 me = new Ex04();
            me.func01(); // me는 참조변수
        }
    
        public void func01(){
            System.out.println("non-static method func01");
        }
    }
    • static과 달리 객체를 생성해야 하기 때문에 성능이 느려지는 단점이 있다.
    • 반면, static이 많으면 자바를 실행할 때 로딩이 길어질 수 있기 때문에 non-static이 더 빨리 실행되고, 메모리 사용량이 더 적다.
    • 생성된 참조변수가 사용되지 않을 때 garbage collection에 의해 지워진다.
    • 객체를 생성하는 건 IO 다음으로 제일 무거운 작업이어서 꼭 필요할 때만 생성하도록 한다.
    • single time pattern : 객체 생성을 무분별하게 하는 것을 막기 위한 디자인 패턴

    메서드 overload

    원칙적으로 메서드명의 중복은 불가하다.

    단, 다음의 세가지가 구분 가능하면 중복이 허용된다.

    1. 매개변수의 유무
    2. 매개변수의 타입
    3. 매개변수의 갯수와 순서
      (쉽게 println을 사용할때를 생각하면 된다.)
      -> 주로 사용자 편의성을 위해 존재한다.
    class Ex05 {
        public static void main(String[] args) {
            func01();
            func01(123);
            func01("test");
            func01(111, 222);
        }
        public static void func01(){
            System.out.println("매개변수 없음");
        }
        public static void func01(int a){
            System.out.println("매개변수 int : " + a);
        }
        public static void func01(String a){
            System.out.println("매개변수 String : " + a);
        }
        public static void func01(int a, int b){
            System.out.println("매개변수 int 2개 : " + a + ", " + b);
        }
    }

    변수

    클래스 변수(static)

    public static int su1;

    멤버필드(non-static)

    public int su2;

    public static void main(String[] args) {
            Ex06 me = new Ex06();
            System.out.println(me.su2);
        }
    class Ex06 {
        public static int su1 = 1111;
        public int su2 = 2222;
        public static int su3; // default value 0으로 초기화된다.
        public static String msg; // default value는 null이다. 
        public static void main(String[] args) {
            System.out.println(su1);
            Ex06 me = new Ex06();
            System.out.println(me.su2);
            System.out.println(su3);
            System.out.println(msg);
        }
    }
    • 클래스 변수는 선언과 초기화가 따로 될 수 없다.

    Windows script 만들기

    .bat 파일을 만들어 cmd에 적었던 실행 코드를 적어 저장 후 폴더에서 실행한다.

    'bat 배치문법'을 검색해서 사용할 수 있는 기능들을 살펴본다.

    • pause : 프로그램이 끝난 후 창이 바로 꺼지지 않고 멈춘다.
    • @echo off : 명령어의 이름을 감춘다.

    JDK가 설치되지 않은 사용자들을 위해서

    • class 실행시키는 윈도우 스크립트 만들기
    set PATH=C:\Program Files\AdoptOpenJDK\jdk-8.0.292.10-hotspot\jre;%PATH%
    cls
    
    @echo off
    java Ex09
    pause

    compile.bat 만들기

    @echo off
    set /p fname=Insert Filename :
    javac -encoding utf8 -d dist %fname%.java
    cd dist
    cls
    java %fname%
    cd ..
    pause
    cls

     

    Day03.7z
    0.00MB