ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • day18_1- JAVA (자바 ,static 메서드, 인스턴스메서드, 메서드 오버로딩, 생성자, this)
    KIC/JAVA 2021. 7. 15. 23:02
    반응형

    스태틱과 인스턴스의 차이

    -> 스태틱은 변수 선언 시에 메모리 할당

    -> 인스턴스는 new로 객체화 할때 메모리 할당

    -> 즉 스태틱의 메모리 할당 시점이 더 빠르다는 것이 기억할 점

     

    [static 메서드(클래스 메서드)]

    -> static 메서드로 표현 가능. static이 붙어있으면 클래스 메서드, 붙어있지 않으면 인스턴스 메서드이다.

     

    -> static 메서드는 변수의 선언이 될 때 바로 생성이 된다. new 연산자를 생성하지 않아도 바로 불러 쓸 수 있다.

     

    -> static 메서드는 durtl static 변수 처럼 객체를 생성하지 않고도 '클래스이름.메서드이름' 와 같은 식으로 호출이 가능

     

    -> 메서드 내에서 인스턴스 변수를 사용하지 않거나, 클래스(static) 변수만 사용하는 메서드들은 static 메서드로 정의하는 것이 좋다. 반대로 인스턴스만 사용할 땐 인스턴스 메서드로 선언하는 것이 좋다.

     

    -> 인스턴스 변수를 사용하지 않는다는 조건으로 static 메서드를 사용할 수 있다.

    -> staitc 멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우에는 인스턴스 를 생성해 주소를 달아서 써야 한다.

    (인스턴스 멤버(인스턴스 변수와 인스턴스 메서드)는 반드시 객체가 생성한 후에만 참조 또는 호출이 가능하기 때문)

     

    -> static 멤버에서 인스턴스 멤버를 가져다 쓰는 것은 불가능 (멤버는 변수 + 메서드라는 뜻)

    -> 인스턴스 멤버는 메모리 할당되는 시점에서 이미 static 멤버가 있기 때문에 가져다 쓰기 가능

     

     

     

     

    [인스턴스메서드]

    -> new 연산자를 생성해야 불러 쓸 수 있다. 객체화를 해야하는 메서드 

     

    -> 인스턴스 메서드는 인스턴수 변수와 관련된 작업을 하는, 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드 이다.

     

    -> 인스턴스 메서드를 선언한 시점에선 이미 static 메모리들은 다 잡힌 상태라 사용이 가능

     

    -> 인스턴스 변수 뿐만 아니라 인스턴스 메서드를 호출 하는 경우에도 인스턴스 메서드로 선언되어야 한다.

     

     

    package javaPro.java_modifier.java_member;
    
    public class MemberCallEx1 {
        static int cv1 = 10; 
        static int cv2 = cv1; // 클래스 멤버간 호출
        int iv1 = 100;   
        int iv2 = iv1;          // 인스턴출멤버간 호출
        int iv3 =  cv1;        // 인스턴스멤버에서 클래스 멤버 호출
        
        //static int cv3 = iv1; // 클래스 멤버에서 인스턴스 멤버 호출 -> 객체화 필요
        static int cv3 = new MemberCallEx1().iv1; // 클래스 멤버에서 인스턴스 멤버 호출 -> 객체화 필요
    
        public static void main(String[] args) {     
            //cv2 = iv1; // 클래스 멤버인 main 메서드에서 iv1 인스턴스 멤버 접근 불가
            cv2 = new MemberCallEx1().iv1;
    
            // iv1 = cv2;   
            new MemberCallEx1().iv1 = cv2;
    
            // method1(); //error  
            new MemberCallEx1().method1();
    
            method2(); 
        }//2     
        void method1() {
            System.out.println(cv1 + cv2); 
            System.out.println(iv1 + iv2); 
        }
        static void method2() {
            System.out.println(cv1 + cv2);
            // System.out.println(iv1 + iv2); 
            MemberCallEx1 m = new MemberCallEx1(); 
            System.out.println(m.iv1 + m.iv2); 
        }
    }

     

     

     

     

     

     

     

    [메서드 오버로딩]

    -> 메서드는 서로 구별해야하기 때문에 각각 다른 이름을 가져야 하는게 원칙이지만, 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면 같은 이름을 사용해서 메서드를 정의할 수 있게 하는 것

     

     

     

     

    [오버로딩의 조건]

    - 메서드 이름이 같아야 한다.

    - 매개변수의 개수 또는 타입이 달라야 한다.

    - 매개변수는 같고 리턴 타입이 다른 경우는 오버로딩이 성립되지 않는다.

    (리턴 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)

     

     

     

    [오버로딩의 예]

    -> println 메서드를 호출할 때 매개변수로 넘겨주는 값의 타입에 따라 아래의 오버로딩된 메서드들 중의 하나가 선택되어 실행되는 것이다.

     

     

     

    -> 보기 1, 2 는 오버로딩 x

    -> 보기 3, 4 는 오버로딩 o

     

     

     

     

     

     

    [생성자]

    -> 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드

     

    -> 인스턴스 변수 초기화 작업, 인스턴스 생성시 실행되어야 할 작업을 위해 사용

     

    -> 생성자도 메서드 처럼 클래스 내에 선언

     

    -> 구조는 리턴값이 없는 메서드 형태 (생성자는 void도 적지 않는다.)

     

    -> 생성자는 단순히 인스턴스 변수들의 초기화에 사용되는 조금 특별한 메서드라고 생각할 것

    (몇가지 특징만 제외하면 메서드와 동일하다.)

     

    -> 생성자를 생성하지 않으면 컴파일러가 기본 생성자를 자동으로 생성해줌

     

    -> 만약 사용자가 생성자를 하나라도 만들면 기본 생성자는 자동으로 만들어 주지 않는다.

     

    -> 생성자도 오버로딩이 가능하므로 여러개 생성 가능

     

    -> 오버로딩 조건에 맞춰 매개변수의 개수 또는 타입이 달라야 함

     

     

     

    -> 인스턴스를 생성한 다음에 인스턴스 변수의 값을 변경하는 것보다 매개변수를 갖는 생성자를 활용하는 것이 코드를 보다 간결하고 직관적으로 만든다.(생성자의 사용 이유)

    아래 방법보다 위의 생성자를 활용한 방법이 더 간결

     

     

     

     

     

     

    [생성자의 조건]

    -> 생성자의 이름은 클래스의 이름과 같이야 함

    -> 생성자는 리턴 값이 없음

     

     

     

     

    [생성자에서 다른 생성자 호출 - this]

    -> 같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자도 this를 통해 가능

     

    [조건]

    -> 생성자의 이름으로 클래스이름 대신 this를 사용

    -> 한 생성자에서 다른 생성자를 호출할 때에는 반드시 첫 줄에서만 호출이 가능

     

     

    [this]

    -> this - 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장

    -> this(), this(매개변수) - 생성자, 같은 클래스의 다른 생성자를 호출 할때 사용(위의 this가 이것)

     

    -> this를 사용할 수 있는 것은 인스턴스 멤버뿐 staitc 메서드에서는 인스턴스 멤버들을 사용할 수 없는 것처럼 this도 사용 불가능 (static 메서드가 호출된 시점에서 인스턴스가 존재하지 않을 수도 있기 때문)

     

     

     

    package javaPro.java_modifier.java_member;
    
    class Parent {
        int x;
        Parent(int x){ // 기본 생성자가 아닌 개발자가 따로 구현한 생성자
            this.x = x;
        }
        //Parent(){} // 4. 이걸 구현했다면 밑에서 굳이 생성자를 다시 만들 필요는 없다.
    }
    
    class Child extends Parent{
        int y;
    
    // 1. 이 생성자는 지울 수 없다. -> 생성자의 생략은 default 생성자만 가능하기 때문
    // 2. Child가 Parent 생성자를 상속 받았지만 
    //Parent 에게는 default 생성자가 없어서 생략하면 에러가 난다.
        
    //3. 결론은 Parent에 defalut 생성자가 없다면 Child에서도 따로 생성자를 만들어 줘야 한다.
        public Child(){ 
            super(10);//super(10)을 만든 생성자의 가장 첫줄에 써야하는 것이 문법
        }
    }
    public class SuperEx {
        public static void main(String[] args) {
            Child c = new Child();
            System.out.println(c.x); // Child가 Parent에게 상속받은 있던 변수 x 
        }
        
    }

     

     

    300x250

    댓글

Designed by Tistory.