24일차
객체를 만드는 설계도를 어허게 만드느냐
속성과 기능을 가지고 있으니 설계도도 어떤값과 기능으을 가져아흔니 잇어야함
속성이 필드 기능이 메소드이다.

같은 이름의 메소드 println사용햇엇다
파라미터가달라 서로다른 메소드엿다

6. 클래스

6.5 메소드

6.5.7 가변길이 파라미터

파라미터를 몇개담을지 모를때가잇다.
과거에는 배열로 받는 메소드를 만들어 사용햇다.

void method1(int[] args) {
    for (int arg : args) {
        System.out.println("받은 파라미터:" + arg);
    }
}

o1.method1(new int[] {});
o1.method1(new int[] { 3 });
o1.method1(new int[] { 9, 10 });
o1.method1(new int[] { 100, 200, 300 });

그런데 이게 불편해서 생겨난게 있다.
...을 사용하고 받을때는 배열로 받는다.
가변길이 매개변수는 파라미터 목록중 가장 오른쪽에 작성해야한다.

void method3(int ... args) {
    //args를 배열로 사용
    for (int arg : args) {
        System.out.println("가변길이 파라미터:" + arg);
    }
}

void method4(String param, double d, int ... args) {
    //args를 배열로 사용
    for (int arg : args) {
        System.out.println("가변길이 파라미터:" + arg);
    }
}

o1.method3();
o1.method3(5);
o1.method3(100, 200);
o1.method3(99, 88, 77, 66, 55);
o1.method3(new int[] { 0, 3, 5, 9 }); //배열로 받으니 배열로 넣어도된다.

모르고 있엇으나 과거에 사용하고 있었다.
->printf가 이런 종류이다.
System.out.printf("%d\n", 99);
System.out.printf("%10s,%10s\n", "hello", "world");

6.5.8 return

return을 만나면 메소드를 종료시킨다.

void method1() {
    System.out.println("실행문1");
    System.out.println("실행문2");

    return; // 메소드 종료

    // System.out.println("실행문3"); 도달불가
}

return은 메소드 종료뿐만이 아니라 오른쪽 값을 호출한 곳으로 return(반환)하는 역할도 한다.
오른쪽값은 메소드 리턴타입과 일치해야한다.
메소드에 리턴타입을 명시하면 해당 타입의 값을 꼭 리턴해야한다.

int method1() {
    return 3; 
}

void메소드는 리턴값이 없는 메소드이다.
void에서는 만약 return을 쓴다면 메소드 종료 역할로만 사용가능하다.

6.5.9 return -2

return값을 메소드를 호출한 후 리턴값을 반환한다.

public class MyClass13 {
    int method1() {
        // .....
        return 3; // 호출한 곳으로 반환(return)
    }

    String method2() {
        return "hello";
    }
}

public class C13Return {
    public static void main(String[] args) {
        MyClass13 o1 = new MyClass13();

        int var1 = o1.method1();
        System.out.println(var1); // 3

        int var2 = o1.method1() * 2;

        String var3 = o1.method2();
        System.out.println(var3); // hello

        String var4 = o1.method2() + "java";
        System.out.println(var4); // hellojava

        System.out.println(o1.method2()); // hello
    }
}

메소드의 리턴타입을 확인후 적절한 변수에 담아서 사용하면된다.
값이 치환된다고 생각하면 된다.

6.5.10 문제풀기

프로그래머스 120843 공던지기
배열 길이가 무한하다라고 생각하기
순번 1 2 3 4 5 6 7
인덱스 0 2 4 6 8 10 12
6 인덱스 0 2 4 0 2 0 4
무한하다면 인덱스 == (순번 - 1) * 2
실제 인덱스 == 무한인덱스 % 길이

6.6 static

설계도에 속성과 기능을 가지고 있고각각이 필드와 메소드이다.
필드와 메소드는 인스턴스가 어떤 상태임을 나타내는 것으로 instance member라고 한다.
자동차라면 자동차는 바퀴가 몇개이고 그러게 나와잇다.
그런데 어쩔 때 설계도 자체 클래스 자체의 값이 필요한 경우가 있다.
클래스 자체의 기능 메소드가 필요한 경우가 있다.
instancef멤버를 작성할때와 비슷하지만 앞에 static키워드가 붙는다.

public class MyClass02 {
    // static filed
    static String name;
    static int age;

    // static method
    static void greeting() {
        System.out.println(age + "살" + name + "입니다.");
    }
}

public class C02Static {
    public static void main(String[] args) {
        MyClass02.name = "hi";
        MyClass02.age = 100;

        MyClass02.greeting(); //100살hi입니다.
    }
}

인스턴스 객체를 만들지 않아도 바로 사용이 가능하다.
지금까지 사용하던 System.out이 정적 필드를 사용하는 거였다.

6.6.1 static 확인문제 17번

public class Printer {
    public static void println(int i) {
        System.out.println(i);
    }

    public static void println(boolean b) {
        System.out.println(b);
    }

    public static void println(double d) {
        System.out.println(d);
    }

    public static void println(String str) {
        System.out.println(str);
    }
}

public class ex17 {
    public static void main(String[] args) {
        Printer.println(10);
        Printer.println(true);
        Printer.println(5.7);
        Printer.println("홍길동");
    }
}

결론은 뭐냐? 어케 사용하는지가 중요한가?
클래스 설명을 봣을때 어떤필드가 잇는지 타입은 뭔지 어떤메소드가 잇는지
정적인지 그런 읽는 방법을 배우는 것이다.

6.6.2 instance

인스턴스 필드와 메소드를 묶어서 인스턴스 멤버라고 한다.
instance member끼리 서로 접근 가능하다.
인스턴스 메소드에서 인스턴스 필드 사용 등등의 일 가능함
인스턴스 메소드에서 인스턴스 메소드를 호출하는 것도 가능하다.

public class MyClass03 {
    String name;

    void hello() {
        System.out.println(name + "님 안녕하세요.");
        System.out.println("오늘은" + now() + "입니다.");
    }

    String now() {
        return "2023년 2월 28 일";
    }
}

6.6.3 static끼리 접근

그럼 static멤버끼리 서로 접근이 가능한가? 가능하다.

public class MyClass04 {
    static String name;

    static void hello() {
        System.out.println(name + "님 안녕하세요.");
        System.out.println("오늘은" + now() + "입니다.");
    }

    static String now() {
        return "2023년 2월 28 일";
    }
}

6.6.4 static - instace관계

설계도가 특정 instace를 보는게 가능한가? 불가능하다.
그래서 static에서 instace로 접근하는것은 불가능하다.
그 반대로 실제 자동차가 설계도를 보는게 가능한가? 가능하다.
instance에서 static에 접근하는 것은 가능하다.

각 instance가 설계도에 있는 것을 호출하는것? 가능하다. 그 설계도로 instance를 만들엇기 때문이다.
설계도에서 여러 instance가 잇는데 하나를 특정할 수가 없다.

public class MyClass05 {
    // instance filed
    String name;

    // static filed
    static String model;

    // instance method
    void printName() {
        System.out.println(name);
        System.out.println(model);
    }

    // static method
    static void printModel() {
        System.out.println(model);
        // System.out.println(name); 불가능
    }
}

6.6.5 this

클래스에서 인스턴스멤버를 사용하려면 객체를 만들고 해야한다.
참조값을 대신하는 키워드를 사용할 수 있다.

다른 클래스에서 객체를 접근하려면 참조변수를 이용해서 접근했다.
설계도를 만드는데에는 자동차가 없다. 그런데 자동차가 있는 것처럼 이용할 수 있다.
만들어지지 않은 객체의 참조값을 얻을 수 있다.

public class MyClass01 {
    //instance field
    String name;

    //instace method
    void printName() {
        System.out.println(this.name);
        System.out.println(this.now());
    }
}

-> 여기서는 꼭 사용안해도 된다.

6.6.6 this - 2

특별히 쓰는 경우는 무엇일까?

//instace method
void printName() {
    String name = "park";
    System.out.println(name); //지역변수
    System.out.println(this.name); //instance field
}

꼭 객체의 name을 쓰고싶다면 this를 붙여야한다. 안붙이면 지역변수가 된다.

void setName(String name) {
    //파라미터 name을 필드 name에 할당
    this.name = name;
}

매개변수를 받아서 필드에 저장하고 싶을때 구분하기 위해 this를 붙임
만들어지지 않는 instacne를 대신하는 것이다.

6.7 final

final : 값을 한번만 할당할 수 있다.

public class C01Final {
    public static void main(String[] args) {
        // final : 값을 한번만 할당할 수 있다.
        int a = 3;
        a = 5;

        final int b = 5;
        // b = 10; 불가능
    }

    static public void method(int i) {
        System.out.println(i);
        i = 5;
        System.out.println(i);
    }

    static void method2(final int i) {
        System.out.println(i);
        // i = 5; 불가능
        System.out.println(i);
    }
}

6.7.1 static final

staic final의 변수명은 대문자 SNAKE_CASE로 작성한다.
이것들을 '상수'라고 한다.

public class MyClass03 {
    static int k;
    final static int L = 99;
    static final int M = 100;
}

2023.02.28 후기

클래스를 점점 진행하고 있다. 목요일부터 클래스에서 가장 이해가 안됬던 생성자 부분을 배우게 될 것이다.

'국비 > Java' 카테고리의 다른 글

2023.03.03 26일차 Java  (0) 2023.03.06
2023.03.02 25일차 Java  (0) 2023.03.02
2023.02.27 23일차 Java  (0) 2023.02.27
2023.02.24 22일차 Java  (0) 2023.02.24
2023.02.23 21일차 Java  (0) 2023.02.23

+ Recent posts