DevCastleOne

[JAVA] 클래스란?

2020. 12. 16. 01:28

백기선님의 live-study 목적으로 작성했습니다.

 

[목차]

1. 클래스 정의하는 방법

2. 객체 만드는 방법

3. 메소드 정의하는 방법

4. 생성자 정의하는 방법

5. this 키워드 이해하기

 

Optional) 

BinaryTree와 Node 클래스를 정의해 bfs , dfs 를 구현


1.클래스 정의하는 방법

 

public class Banana {

	//변수 , 필드(Field)
    int name;
    int price;
    
    //생성자
    public Banana(){    
    }

	//메서드
    public void print(){
        System.out.println("name : " + name + " price : " + price);
    }

}

 

 

클래스는 '객체를 생성하기 위한 틀' 이므로 틀 안에는 그것을 표현하기 위한

정보로 변수(필드) , 생성자 , 메서드가 존재한다.

 

- 변수(필드) : 객체의 데이터 저장 공간

- 메소드 : 객체의 동작을 실행

- 생성자 : 객체 생성하기 위한 역할

 

※ 변수(필드)

- 선언위치에 따라 변수의 타입이 달라진다.

- 클래스변수 , 인스턴스변수 , 지역변수 모두 세 종류가 있다.

public class Banana {

    int name; //인스턴스변수
    static int price; //클래스 변수(static 변수 , 공유변수)

    void method(){
      int localVal; // 지역변수   
    }   
    
}

 

- 인스턴스 변수(instance variable) 

: 클래스의 인스턴스를 생성할 때 만들어지고 변수에 데이터 값을 저장하거나 가져오기 위해선

  우선 인스턴스를 생성해야 함 

 

- 클래스 변수(class variable)

: static을 붙이면 된다.

: 인스턴스마다 독립적인 공간을 가지는 인스턴스 변수와 달리 모든 인스턴스가 유지될수 있는 

  공통된 저장된 공간을(stack)을 공유한다.

 

- 지역변수(local variable)

: 메서드 내에서만 사용 가능하다.

 

 

 

2. 객체 만드는 방법

 

public class Banana {

    int name; //인스턴스변수
    static int price; //클래스 변수(static 변수 , 공유변수)

    void method(){
      int localVal; // 지역변수   
    }   
    
}

Banana 클래스가 있다고 가정하면

클래스를 객체로 만드는 과정을 인스턴스화라고 한다.

클래스가 객체가 되기 위해서는 new 연산자가 필요하다.

 

※ 객체 생성 방법!

 

클래스명 변수명 = new 클래스명();

( Banana banana = new Banana() )

 

※ new 연산자란 !

 

new 연산자는 클래스 타입의 인스턴스를 생성해주는 역할을 하면서 

메모리(Heap 영역)에 공간을 할당받고 그곳에 객체가 생성이 된다.

생성이 되면서 객체의 주소를 리턴하고 리턴한 주소를 클래스 변수에 저장하면서 객체를 사용할 수 있게 된다.

 

 

public class Banana {

    public Banana(){

    }

    public void print(){
        System.out.println("바나나 클래스 입니다.");
    }

    public static void main(String[] a){
        Banana banana = null;
        System.out.println("객체생성 전 : " + banana);
        banana = new Banana();
        System.out.println("객체생성 후 : " + banana);
        banana.print();
    }

}

==========================결과==========================
객체생성 전 : null
객체생성 후 : Banana@3941a79c
바나나 클래스 입니다.

객체생성 후 인스턴스의 값을 가지는것을 볼수있습니다.

 

아래 그림의 형태의 모습으로 객체를 참조하게 됩니다.

 

 

3. 메소드 정의하는 방법

 

메소드는 정의부와 호출부로 나뉘게 된다.

정의부 : 접근지정자 , 리턴타입, 메소드명 , 파라미터

호출부 : 메소드의 기능을 호출 ( {} 안 )

 

 public void print(){
        System.out.println("바나나 클래스 입니다.");
 }
 

위의 메소드에서 정의부와 호출부를 나눠보자면

정의부 =>  public : 접근지정자 , void : 리턴타입  , print : 메소드명 

호출부 => { } 안

 

# 메소드 오버로딩 ( Method Overloading ) 

기본적으로 메소드는 같은 메소드명을 사용해서 여러개 만들수 없습니다.

하지만 파라미터를 다르게 정의한다면 여러개 만들수 있습니다. 이것이 메소드 오버로딩이라고 부릅니다.

 

public class Banana {

    public Banana(){

    }

    public void print(){
        System.out.println("바나나 클래스 입니다.");
    }

    public void print(String color){
        System.out.println("바나나 클래스 입니다.");
        System.out.println("색상은 " + color + " 입니다");
    }

    public static void main(String[] a){
        Banana banana = new Banana();
        banana.print();
        banana.print("노란색");
    }

}

====================결과====================
바나나 클래스 입니다.
바나나 클래스 입니다.
색상은 노란색 입니다

 

 

# 메소드 오버라이딩 ( Method Overring ) 

메소드 오버라이딩은 상위 클래스가 정의한 메소드를  하위 클래스에서 재정의 하는 기법입니다.

 

class Fruit{
    public void print(){
        System.out.println("과일입니다.");
    }
}

public class Banana extends Fruit{

    public Banana(){
    }

    public void print(){
        System.out.println("바나나 클래스 입니다.");
    }

    public static void main(String[] a){
        Fruit banana = new Banana();
        banana.print();

        Fruit fruit = new Fruit();
        fruit.print();
    }

}

=========================결과=========================
바나나 클래스 입니다.
과일입니다.

재정의를 하게 되면 업캐스팅이 되었을때 하위 클래스 메소드를 호출하게 됩니다.

 

 

4. 생성자 정의하는 방법

 

생성자는 클래스를 객체로 만들때 초기화 하는 작업을 한다.

객체를 생성할때 new 연산자 뒤에 붙는게 생성자이다.

디폴트 생성자 , 묵시적 생성자 , 명시적 생성자로 구분된다.

 

#생성자 규칙

1. 클래스 이름과 동일해야함

2. 리턴 타입이 없다.

3. 클래스는 한개 이상의 생성자를 가지게 된다.

4. 명시적 생성자만 선언한 상태에서 묵시적 생성자를 사용하려면 무조건 묵시적 생성자를 선언해줘야함

 

# 디폴트 생성자

클래스 내부에 선언된 생성자가 없는 경우 객체 생성시 컴파일러가 자동으로 생성해줌.

(즉, 묵시적 or 명시적 생성자가 존재할 경우 디폴트 생성자는 만들어지지 않음) 

클래스 그렇기 때문에 클래스를 생성할때 new 클래스명() 이 가능 

class Banana{ 
}

===-> 컴파일후

class Banana{ 
   public Banana(){
   }
}

 

# 묵시적 생성자

파라미터 값을 가지지  않는 생성자

디폴트 생성자와 정의부는 같지만 호출부는 달라질수 있다 

 

class Banana{ 
   public Banana(){
   	  System.out.println("묵시적 생성자");
   }
}

 

# 명시적 생성자

파라미터 값을 가지는 생성자

class Banana{ 
   public Banana(String color){
   	  System.out.println("명시적 생성자");
   }
}

 

5. this 키워드 이해하기

클래스가 인스턴스화 되었을때 자기 자신을 나타내는 키워드이다.

클래스 내부의 필드 이름과 메소드를 통해 넘어온 파라미터의 이름이 같을 경우

this 키워드를 통해 구분이 가능하다.

 

public class Banana{

    String color;
    
    public Banana(String color){
        this.color = color;
    }

    public void print(){
        System.out.println("색상이 " + color + "색 입니다." );
    }

    public static void main(String[] a){
        Banana banana = new Banana("노란");
        banana.print();
    }

}

===============결과===============
색상이 노란색 입니다.

만약 this.color = color 가 아닌 color = color를 하게 되면 파라미터로 들어온 color = color를 하기 때문에

클래스 내부필드 color가 초기화 되지 않는다.

 

※ this()란?

this가 자시자신을 나타내는 키워드이고 this()는 자기자신의 함수 즉 생성자 호출이다.

주의할점은 생성자의 첫문장에서 사용되어야 한다.

 

public class Banana{

    String color;

    public Banana(){
        this("노란");
    }

    public Banana(String color){
        this.color = color;
    }

    public void print(){
        System.out.println("색상이 " + color + "색 입니다." );
    }

    public static void main(String[] a){
        Banana banana = new Banana();
        banana.print();
    }

}

 

※ Optional

github.com/castleCircle/liveStudy/tree/master/src/main/java/weeks5

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band