1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package p278;
 
/* 
 ⓐ 생성자 
 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다. 따라서 변수의 초기화 작업에
 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다.
 
 생성자 역시 메서드처럼 클래스내에서 선언되며, 구조도 메서드와 유사하지만, 리턴값이
 없다는 점이 다르다. 그렇다고 해서 생성자 앞에 리턴값이 없음을 뜻하는 키워드 void를 
 사용하지 않고, 단지 아무것도 적지 않는다. 생성자의 조건은 다음과 같다.
 1. 생성자의 이름은 클래스의 이름과 같아야 한다.
 2. 생성자는 리턴값이 없다.
 
 class Card{
 card()
 */
class Car {
    String color;
    String gearType;
    int door;
 
    Car() {
    }
 
    Car(String c, String g, int d) {
        color = c;
        gearType = g;
        door = d;
    }
}
 
class CarTest {
    public static void main(String[] args) {
        Car/* (클래스명) */ c1/* (변수명) */ = new Car();/* (인스턴스의 생성) */
        c1.color = "white";
        c1.gearType = "auto";
        c1.door = 4;
 
        Car c2 = new Car("white""auto"4);
 
        System.out.println("c1의 color=" + c1.color + ", gearType=" + c1.gearType + ", door=" + c1.door);
        System.out.println("c1의 color=" + c2.color + ", gearType=" + c2.gearType + ", door=" + c2.door);
    }
}
cs

 

다음과 같이 생성자를 만들었을 경우 c1처럼 해도 되고 , 아니면 가시적으로 보기 편하게 c2를 통해 만들어도 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package p278;
 
class p283 {
 
    /*
     * 오버로딩이란? 메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각 기 다른 이름을 가져야한다.
     * 그러나 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면,
     * 같은 이름을 사용해서 메서드를 정의할수 있다. 이처럼, 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩
     * 또는 간단히 오버로딩이라 한다. 오버로딩의 사전적 의미는 과적하다. ※ 오버로딩의 조건 ⓐ 메서드 이름이 같아야 한다. ⓑ
     * 매개변수의 개수 또는 타입이 달라야 한다.
     */
    public static void main(String[] args) {
        MyMath3 mm = new MyMath3();
        System.out.println("mm.add(3,3) 결과" + mm.add(33));
        System.out.println("mm.add(3L,3) 결과" + mm.add(3L, 3));
        System.out.println("mm.add(3,3L) 결과" + mm.add(3, 3L));
        System.out.println("mm.add(3L,3L) 결과" + mm.add(3L, 3L));
 
        int[] a = { 100200300 };
 
        System.out.println("mm.add(a) 결과:" + mm.add(a));
    }
}
 
class MyMath3 {
    int add(int a, int b) {
        System.out.print("int add(int a, int b) - ");
        return a + b;
    }
 
    long add(int a, long b) {
        System.out.print("long add(int a, long b) - ");
        return a + b;
    }
 
    long add(long a, int b) {
        System.out.print("long add(long a, int b) - ");
        return a + b;
    }
 
    long add(long a, long b) {
        System.out.print("long add(long a, long b) - ");
        return a + b;
    }
 
    int add(int[] a) {
        System.out.print("int add(int[] a - ");
        int result = 0;
        for (int i = 0; i < a.length; i++) {
            result += a[i];
        }
        return result;
    }
}
cs

 

다음과 같은 방법을 통해 오버로딩이 가능하다. 즉 메서드의 이름은 동일하지만 안에 들어가는 매개변수의 형태가 다른경우를 오버로딩이라 정의를 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package p278;
 
class p281 {
    int iv = 10// 클래스 변수안에 존재하는 인스턴스 초기화후 iv에 10이 존재
    static int cv = 20// 클래스 멤버 statc cv에 20이 존재
 
    int iv2 = cv; // 인스턴스 변수는 클래스 변수를 참조할수 있다.
 
    // 그러나 아래와 같이 클래스 변수는 인스턴스변수를 참조할수 없다. 에러발생!!!
    /* * static int cv2=iv; 클래스변수는 인스턴스 변수를 사용 할 수 없음 */
 
    static int cv2 = new p281().iv;
 
    static void staticMethod1() {
        System.out.println(cv);
        /* System.out.println(iv); 클래스메서드에서 인스턴스 변수를 사용불가 */
        // 객체를 생성한 후에 인스턴스변수의 참조가능
        p281 c = new p281();
        System.out.println(c.iv);
    }
 
    void instanceMethod1() {
        System.out.println("인스턴스변수에서 호출하는 클래스변수" + cv);
        System.out.println("인스턴스에서 호출하는 인스턴스변수" + iv);
    }
 
    static void staticMethod2() {
        staticMethod1();
        /* instanceMethod1(); 클래스메서드안에서는 인스턴스메서드를 호출할수 없다. */
        p281 c = new p281();
        c.instanceMethod1();
    }
 
    void instanceMethod2() {
        staticMethod1();
        instanceMethod1();
    }
}
 
cs

 

다음은 클래스변수와 인스턴스변수의 차이점을 나열한 소스코드이다.

본 소스코드를 통해 자바에 대해 자세히 알수 있다.

'23.12.24 삭제예정 > 자바' 카테고리의 다른 글

기본형 매개변수 VS 참조형 매개변수  (0) 2017.05.25
Super()-조상 클래스의 생성자  (0) 2017.05.01
오버라이딩의 조건  (0) 2017.05.01
자바-생성자  (0) 2017.04.27
자바-오버로딩에 관해서  (0) 2017.04.24

+ Recent posts