Java

[스터디 5주차] 자바 클래스

msmn 2020. 12. 23. 18:25
728x90

학습할 것

  • 클래스 정의하는 방법
  • 객체 만드는 방법 (new 키워드 이해하기)
  • 메소드 정의하는 방법
  • 생성자 정의하는 방법
  • this 키워드 이해하기

1. 클래스 정의하는 방법

클래스를 이해를 하기전에 객체지향 프로그래밍에 대한 이해가 필요하다.

 

# 객체지향 프로그래밍(OOP, Object-Oriented Programming)이란?

실제 존재하는 모든 것들을 '객체'로 취급하여 프로그래밍하는 방법이다.

실세계를 모델링하기 위해 나온 것으로 캡슐화, 정보은닉, 추상화, 상속성, 다형성의 특성을 가지고 있다.

 

* 캡슐화: 속성(데이터)와 메소드(데이터를 처리하는 함수)를 하나로 묶은 것을 말한다.

캡슐화된 객체들은 재사용이 용이하다.

 

* 정보은닉: 캡슐화를 통해 가능해지는 개념으로 외부로부터 정보를 은닉하는 기능이다.

이후에 private, public, protected라는 접근 제어자가 이에 해당된다.

 

* 상속성: 이미 정의된 객체의 속성과 메소드를 다른 객체가 물려받을 수 있는 기능이다.

하위클래스가 상위클래스의 속성과 연산을 정의하지 않고 즉시 사용할 수 있다.

 

* 추상화: 중요한 특징들을 찾아내 간단하게 표현하는 것을 말한다.

객체지향에서는 실제 사물을 클래스로 정의하는 것을 추상화라고 볼 수 있다.

EX) 강아지를 Dog라는 클래스로 만드는 것, Dog클래스와 Cat클래스의 공통된 기능을 묶어 Animal클래스를 만드는 것 등

 

* 다형성: 하나의 클래스나 메소드가 다양한 방식으로 동작가능한 것을 말한다.

오버로딩, 오버라이딩 등이 이에 속한다.

 

# 클래스란?

클래스란 쉽게 설명하자면 객체를 만들기 위한 틀이라고 할 수 있다.

public class HelloWorldMain { //클래스
    public static void main(String[] args) { //메인 메소드
        System.out.println("Hello World!");
    }
}

클래스 내용에는 변수와 메소드가 들어가게 된다.

이렇게 만들어진 클래스는 객체를 만들기위한 틀, 설계도에 불과하다.

실제 객체를 만들기 위해서는 인스턴스화를 거쳐주어야한다.


2. 객체 만드는 방법 (new 키워드 이해하기)

# 객체와 인스턴스의 차이?

/* 클래스 */
public class Animal {
  ...
}
/* 객체와 인스턴스 */
public class Main {
  public static void main(String[] args) {
    Animal cat, dog; // '객체'

    // 인스턴스화
    cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
    dog = new Animal(); // dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
  }
}
클래스명 변수명 = new 클래스명();

객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.

OOP의 관점에서 객체가 메모리에 할당되어 실제로 사용될 때 '인스턴스'라고 부른다.

인스턴스화는 new 연산자를 통해 이루어지며 변수명을 통해 객체를 사용하게 된다.

 

# new 연산자란?

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

메모리(Heap 영역)에 공간을 할당받고 그 공간의 참조값을 객체에게 반환해주는 역할을 한다.

 

# 객체의 생성과정

1) new 연산자가 메모리 영역에 저장공간을 할당

2) 생성자가 객체를 초기화

3) new 연산자가 새로 생긴 객체의 주소를 변수에 저장

4) 변수를 통해 해당 객체에 접근


3. 메소드 정의하는 방법

접근제어자 리턴타입 메소드명(파라미터){
   // 실행할코드
   return 리턴타입;
} 

 

접근제어자가 없어도 정의가 가능하다.

 

# 접근제어자란?

접근제어자 같은 클래스의 멤버 같은 패키지의 멤버 자식 클래스의 멤버 그 외의 영역
public
protected  
default(명시하지 않음)    
private      

4. 생성자 정의하는 방법

클래스는 기본적으로 객체를 초기화해주는 생성자라는 메소드를 가지게 된다.

이런 생성자는 객체를 인스턴스하면 가장 먼저 호출된다.

 

public 클래스이름() {
}
public class HelloWorldMain {
    public HelloWorldMain() { //생성자
        System.out.println("Hello World!");
    }
    public static void main(String[] args) {
        HelloWorldMain helloWorldMain; //객체 생성
        helloWorldMain = new HelloWorldMain(); //인스턴스화
    }
}

# 생성자의 3가지 조건

1) 생성자의 메소드명은 반드시 클래스이름과 동일해야한다.

2) 생성자의 접근제어자는 반드시 Public이어야한다.

3) 생성자는 return 값을 가지지 않는다.

public Class Test{
      int a;
      
      //기본생성자
      public void Test(){}

      //매개변수를 가진 생성자
      public void Test(int a){
            this.a = a;
      }
}

위와 같이 생성자를 여러개를 선언할 수 있다.


5. this 키워드 이해하기

클래스 생성에 자주 사용되는 키워드 중 하나로 '객체, 자기 자신'을 나타내는 명령어이다.

 

* 클래스의 속성과 매개변수 이름이 같을 때

public class HelloWorldMain {
    int a;

    public void test(int a) {
        this.a = a;
    }
}

test메소드에서 a = a와 같이 작성하면 스코프에 의해서 초기화가 되지 않는다.

그래서 매개변수로 전달받은 a를 this 키워드를 통해 객체에 전달할 수 있게한다.

 

* 오버로딩된 다른 생성자를 호출할 때

public Class Test{
       int a;
       int b;

       public void Test(){
           this(null,null);
       }

       public void Test(int a){
           this(a, null);
       }

       public void Test(int b){
           this(null, b);
       }

       public void Test(int a , int b){
            this.a = a;
            this.b = b;
       }
}

this()는 위와 같이 생성자를 부르기 위해 사용된다.

가장 많이 사용되는 것이 위와 같은 형태로 속성을 초기화하는 부분을 축약할 때 사용된다.

주의할 점은 this()가 반드시 생성자의 첫번째 문장에 사용되어야한다는 것이다.

 

* 객체 자신의 참조값을 전달하고 싶을 때

public class HelloWorldMain {

    public HelloWorldMain() {
    }

    public HelloWorldMain getHelloWorldMain() {
        return this;
    }
}

 

위와 같이 객체 자신의 참조값을 전달하고 싶을 때 this 키워드를 사용한다.

 

# super 키워드

this를 공부하면 바로 다음으로 나오는 키워드이다.

자식클래스가 부모클래스로부터 상속받은 멤버를 사용하고자할 때 사용한다.

class Parent{
   int a = 10;
}

class Child extends Parent{
    int a = 20;
    
    void childMethod(){
           System.out.println(a);         //20
           System.out.println(this.a);     //20
           System.out.println(super.a);   //10
    }
}

# super() 키워드

class Canvas2D{
	int x;
	int y;
		
	public Canvas2D(int x, int y) {
		this.x = x;
		this.y = y;
	}
}
	
class Canvas3D extends Canvas2D{
	int z;

	public Canvas3D() {
		this(100, 200, 300);
	}
		
	public Canvas3D(int x, int y, int z) {
		super(x, y);
		this.z = z;
	}
}

super()로 생성자를 호출할 경우 자기자신이 아닌 부모클래스의 생성자를 호출한다.

 


Reference

blog.naver.com/swoh1227/222174170682

728x90