Skip to the content.

목표:자바의 class에 대해 학습하세요.

먼저 자바의 꽃인 객체지향이다

객체지향의 특징으로는 추상화 캡술화 상속성 다형성이 있다

추상화:실제 세상을 프로그래밍으로 옮길수 있게, 필요한 기능들만 가져와서 단순화했다

캡술화:보안적인 기능에 도움을 주며 규칙 정의,사용 용도 명확히,안에 있는 값을 노출하지 않는다

상속성:부모를 지정하고 부모의 코드를 가져다가 쓸수 있는것이다(코드의 재사용성)

다형성:변수의 여러가지 모습으로 변할 수 있는것이다

클래스 정의하는 방법

class 클래스이름 {
    전역변수
    
    생성자
    
    메서드
    
    }
    

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

클래스를 인스턴스화 하는 방법(출처)

클래스이름 cl = new 클래스이름();

연산자 new에 의해 Heap 메모리에 cl이라는 클래스의 인스턴스가 생성된다

인스턴스 주소가 반환되어 참조변수 cl에 저장된다

메소드 정의하는 방법

먼저 메소드를 작성하는 이유는 중복되는 코드의 반복적인 프로그래밍을 피할수 있기 때문이다

또한 모듈화로 인해 코드의 가독성도 좋아지며 유지보수에 용이하다(자바의 장점)

접근제어자 반환타입 메소드이름(매개변수목록){//선언부
//구현부
}

여기서 메소드이름이 같으나 매개변수 목록이 다를경우 메소드 오버로딩이라고 한다.

int plus(int a,int b){}
double plus(int a,int b){}

접근제어자의 특징과 종류(출처:혼공자)

클래스와 인터페이스를 다른 패키지에서 사용하지 못하도록 막을 필요가 있다

그리고 객체생성을 막기위한 생성자를 호출하지 못하거나 필드나 메소드를 사용하지 못하도록 막아야하는 경우가 있다

이때 접근 제한자를 사용한다

     
접근제한 적용대상 접근할 수 없는 클래스
public 클래스,필드,생성자,메소드 없음
protected 필드,생성자,메소드 자식클래스가 아닌 다른 패키지에 소속된 클래스
default 클래스,필드,생성자,메소드 다른 패키지에 소속된 클래스
private 필드,생성자,메소드 모든 외부 클래스

반환타입

메소드 실행 후 반환하는 값의 타입을 의미한다.그러나 반환값이 있을수도 있고 없을수도 있다.

반환값이 있을경우 반환타입이 와야되며(그때는 return으로 반환값을 메소드에서 탈출시킨다.)

없을경우 void가 와야한다

호출방법

.연산자를 이용하여 호출할 수 있다.

1. 객체참조변수이름.메소드이름();
2. 객체참조변수이름.메소드이름(인수1,인수2,);

생성자 정의하는 방법(출처)

생성자는 new연산자로 호출되는 특별한 중괄호{} 블록이다

생성자의 역할은 객체 생성시 초기화를 담당한다 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 한다

생성자는 메소드와 비슷하게 생겼지만 클래스 이름으로 되어있고 리턴 타입이 없다

여기서 기본생성자는 클래스 내부에 어떠한 생성자도 없을 시 객체 생성 과정에서 컴파일러가 자동으로 추가하는 생성자다

근데 왜 굳이 필요없는 생성자를 만드는것 일까?

이유는 클래스에서 생성자가 없으면 객체에 접근 자체를 하지 못하기 때문이다.

메모리 구조상 new연산자가 생성자를 정상적으로 실행시키면 heap영역에 객체가 생성되고 생성된 객체의 주소가

클래스 타입변수에 리턴되어 객체에 접근할 수 있는데 생성자가 실행되지 않으면 heap영역에 객체가 생성되지 않으니 객체의 주소도 리턴 받을 수 없다.

따라서 객체를 사용하기 위해서는 생성자가 반드시 필요하며 생성자를 따로 명시하지 않으면 자동으로 기본 생성자를 선언한다.

// 기본 생성자 + 메소드

public class Sub {
 // public Sub(){} 
    public int Sum(int iNum1, int iNum2){
    // 생성자 없이 메소드만 구현되어 있으므로 기본 생성자로 선언된다.
        int sum = iNum1 + iNum2;
        return sum;
   }
}
// 묵시적 생성자

public class Sub2 {
    public Sub2(){
    // 파라미터가 없는 묵시적 생성자
        System.out.println("묵시적 생성자");
    }
}
// 명시적 생성자

public class Sub3 {
    public Sub3(String s){
    // 파라미터 값을 받는다.
        System.out.println(s);
    }
}
Sub3 sub3 = new Sub3("명시적 생성자"); // 명시적 생성자

//객체를 생성할 때 String 변수에 파라미터를 줌으로써 String s는 "명시적 생성자"로 초기화된다.

생성자도 또한 오버라이딩이 가능하다

this 키워드 이해하기(출처)

this 키워드는 클래스가 인스턴스화 되었을때의 자기자신의 메모리 주소를 담고있는 키워드이다

객체 자기자신의 메모리 주소를 담고 있으므로 도트연산자(.)를 이용해서 접근하여 맴버변수와 메소드를 사용할 수 있다

public class User {
//맴버변수
    private Integer id;
    protected String account;
    public String password;
//생성자
    public void printId() {
        System.out.println(this.id);
    }
//메서드    
    public void printAll() {
        this.printId();
        System.out.println(this.account);
        System.out.println(this.password);
    }
}

위 코드를 보면 this를 통해 맴버변수나 메소드에 접근하여 사용하는 것을 확인할 수 있다

this()

클래스 내부에서 this()를 호출하면 생성자를 호출한다

물론 매개변수가 있는 생성자라면 그에 맞게 인자를 넣어주어 호출하면 된다

public class User {
    private Integer id;
    protected String account;
    public String password;

    public User(Integer id, String account, String password) {
        this.id = id;
        this.account = account;
        this.password = password;
    }

    public User(Integer id) {
        this(id, "a", "b");
    }
}

위 코드를 보면 매개변수가 하나인 생성자에서 매개변수가 3개인 생성자를 호출하고 있는 것을 알수 있다.

this()를 통해 생성자를 호출할때는 2가지 제약이 있다

1.생성자에서만 호출가능하다

2.제일 첫 문장에서 호출해야한다

3.생성자 자기 자신을 호출할 수 없다(재귀호출이 불가능하다)

여기서 재귀호출이란?

메서드 내에서 자기 자신을 반복적으로 호출하는것