⚙️ backend/☕️ java

Day03. 자바 프로그래밍 기본

dev!n 2023. 7. 7. 08:56

목차

    자바 기본 문법

    Overloading

    1. 하나의 class 내부에 이름이 같은 method가 여러 개 있는 것
    2. 하나의 method 이름을 가지고 기능을 다르게 구현
    3. 작성 규칙
      1. modifier(접근 제한자)는 같아도 달라도 상관 없음
      2. returnType 같아도 달라도 상관 없음
      3. method 이름은 반드시 같아야 함!
      4. 매개변수는 순서 or 타입 or 개수 셋 중 하나는 달라야 함!

    예) System.out.println()

    public void println()
    public void println(boolean x)
    public void println(char x)
    public void println(int x)
    public void println(long x)
    public void println(float x)
    public void println(double x)
    public void println(char[] x)
    public void println(String x)
    public void println(Object x)
    

    Parameter & Argument

    Parameter(매개변수) : 함수 정의 내부의 변수

    Argument(인수) : 함수에 실제로 전달되는 값

    Variable Arguments

    1. 줄여서 Varargs
    2. 임의의 개수의 인자를 받을 수 있다
    3. Vararg parameter must be the last in the list: 마지막 매개변수로만 선언 가능
    4. syntax
    5. accessModifier methodName(datatype… arg) { // method body }

    예) System.out.printf()

    public PrintStream printf(String format, Object... args)
    public PrintStream printf(Locale l, String format, Object... args)
    

    실습) 다양한 datatype의 varargs

    /* 코드 */
    class VarargsTest {
        public void varargsTest(Object... objects) { 
            System.out.println("objects = " + objects);
            System.out.println("objects.length = " + objects.length);
            for (Object obj : objects) {
                System.out.printf("%s %s", obj, obj.getClass());
                System.out.println();
            }
            System.out.println("----------");
        }
    
        public void varargsLast(String s, int... ints) {
            System.out.println("s = " + s);
            for (int i : ints) {
                System.out.println("i = " + i);
            }
        }
    }
    
    public class VariableArgsExam {
        public static void main(String[] args) {
            VarargsTest t = new VarargsTest();
            t.varargsTest(2);
            t.varargsTest();
            t.varargsTest(1, 3, 5, 6, 7);
    
            t.varargsTest("aa", "bb", "cc");
    
            t.varargsTest(2, 3, "aa");
    
            t.varargsLast("테스트", 1, 2, 3);
        }
    }
    
    /* 결과 */
    objects = [Ljava.lang.Object;@6aaa5eb0 // 인자를 리스트로 받아온다
    objects.length = 1
    2 class java.lang.Integer
    ----------
    objects = [Ljava.lang.Object;@62ee68d8 // 0개 이상의 인자
    objects.length = 0
    ----------
    objects = [Ljava.lang.Object;@735b5592
    objects.length = 5
    1 class java.lang.Integer
    3 class java.lang.Integer
    5 class java.lang.Integer
    6 class java.lang.Integer
    7 class java.lang.Integer
    ----------
    objects = [Ljava.lang.Object;@58651fd0 // 업캐스팅
    objects.length = 3
    aa class java.lang.String
    bb class java.lang.String
    cc class java.lang.String
    ----------
    objects = [Ljava.lang.Object;@4520ebad // 여러 데이터타입을 한번에 받을 수 있다
    objects.length = 3
    2 class java.lang.Integer
    3 class java.lang.Integer
    aa class java.lang.String
    ----------
    s = 테스트 
    i = 1 // 반드시 매개변수의 마지막에! 
    i = 2
    i = 3
    
    Process finished with exit code 0
    

    Constructor

    1. 특별한 method
      1. 생성자도 메소드이므로 스택영역에 쌓인다.
    2. method 이름은 반드시 class 이름과 같아야 한다!
    3. returnType이 없다
    4. ⇨ modifier ClassName( [ datatype variableName, ... ] ){ }
    5. 객체가 생성(new)되는 시점에 딱 한 번 실행된다
      1. 모든 메소드가 생성되고 객체 생성 시점에 하나만 호출할 수 있다.
    6. java의 모든 객체는 반드시 한 개 이상의 생성자를 갖는다
    7. Overloading이 가능하다
      1. (이름 같음, 제한자 다를수도, 매개변수 개수.타입.위치 최소 하나는 다름)
    8. 프로그래머가 생성자를 하나도 작성하지 않으면 default 생성자가 만들어진다
    9. ⇨ modifier ClassName( ){ }

    객체가 생성되는 시점에 일어나는 일

    ClassName c = new ClassName(datatype d, ...);

    1. 전역변수를 0에 준하는 값으로 초기화 ex) int i; ⇒ 0
    2. 전역변수를 명시적으로 초기화(프로그래머가 입력한 값) ex) int i = 5;
    3. 생성자 구현부 실행

    같은 클래스 내의 다른 생성자 호출

    this([값, 값, ... ]); ⇨ 반드시 생성자 구현부 첫 번째 줄에서만 가능

    생성자를 사용하는 상황

    객체가 생성되는 시점에 딱 한번 해야하는 일이 있을 경우

    DB 로드, 초기 샘플데이터 로딩, 환경 세팅, ...

    일반 메소드도 가능하지만 생성자는 자동 호출 이점

    Array Size

    Java에선 배열의 크기를 늘릴 수 없다

    그래서 배열의 크기를 따로 관리하는게 더 유연하다. 추가하거나 루프 돌 때.

    (사실 자료구조 쓰면 데이터 조작이 훨씬 편하다!)

    ex)

    public class StudentService {
        Student[] students = new Student[10]; 
        static int STUDENT_SIZE = 0;
    
        public StudentService() {
            students[STUDENT_SIZE++] = new Student("name1", 21, "seoul");
            students[STUDENT_SIZE++] = new Student("name2", 22);
            students[STUDENT_SIZE++] = new Student("name3", 23, "seoul");
            students[STUDENT_SIZE++] = new Student("name4", 24, "seoul");
            students[STUDENT_SIZE++] = new Student("name5", 25);
        }
    
        /**
         * 이름에 해당하는 학생정보 검색
         *
         * @param name 이름은 중복 안됨(pk)
         * @return 찾으면 Student 리턴, 못찾으면 null 리턴(약속)
         */
        public Student selectByName(String name) {
            for (int i = 0; i < STUDENT_SIZE; i++) { // STUDNET_SIZE 만큼 루프를 돈다
                if (students[i].name.equals(name)) return students[i]; //String은 상수, 불변 객체. 주소값이 들어있음.
            }
            return null;
        }
    }
    

     

    참고 링크

    https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/PrintStream.html#println()

    https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/PrintStream.html#println():~:text=public PrintStream printf(String format%2C Object... args)

    https://www.programiz.com/java-programming/varargs

    https://velog.io/@zionedoha/JAVA-오버-라이딩과-형변환

    http://www.ktword.co.kr/test/view/view.php?m_temp1=5482&id=1472