본문 바로가기

자바

[JAVA] 컴퓨터 프로그래밍 - Class 기초

Class

객체의 청사진. 붕어빵 틀이라고 생각하면 편함.
같은 클래스에서 나온 객체들은 같은 기능을 가짐

클래스의 접근 제어자는 두 가지 존재함

접근 제어자 기능
( 없음 ) 같은 패키지에 한해서 호출 가능 ( 타 소스에서 임포트 해서 호출해도 호출 불가)
Public 다른 패키지에서 임포트 해서 호출 가능

추가) 하나의 .java 파일에서는 public class가 하나만 존재할 수 있음
ex) Box.java 파일에는 public class Boxpublic 클래스로 존재 가능.
이름도 동일해야 함!

Instance

Class를 기반으로 하는 객체 붕어빵이라고 생각하면 편함
여러 붕어빵을 찍어낸다고 했을 때, 각 붕어빵은 구조는 같아도 팥의 양 같은 내부 값은 다를 수 있음.

Inheritance (상속)

한 클래스가 다른 클래스의 구조를 따를 수 있음. 이때 두 클래스를 각각 부모 클래스와 자식 클래스라고 부름
extends 키워드로 상속함

상속은 한 클래스당 하나만 상속할 수 있음 ( 다중 상속 불가능 )

class Child extends Parent {
    // Parent의 속성을 기본적으로 지닌 클래스가 됨
    // super() : 부모의 생성자(Constructor) 호출
    // super.method() : 부모의 메소드 호출
}

만약 A 클래스가 B 클래스를 상속하면 B의 인스턴스를 만들었을 때

|A의 부분|B만 가지고 있는 부분|

으로 만들어짐.

Overriding vs Overloading

둘이 이름만 비슷하고 완전 다른거임.

오버라이딩 은 부모의 메소드를 상속받은 자식 클래스가 그 메소드를 바꾸고 싶을때,
똑같이 선언해서 가려버리는 것.

-> 이때 바꾸고자 하는 메소드와 이름, 매개변수는 완전히 같아야 하며,
리턴 타입은 부모보다 자식의 타입이 작거나 같아야 하고,
접근 제어자는 넓거나 같아야 한다.

오버로딩 은 같은 메소드를 여러개 만들어 놓는거다.
똑같은 이름의 메소드를 매개변수를 다르게 해서 여래개 놓는 것.
만약 동일한 매개변수를 가진 함수가 리턴 타입만 다르게 오버로딩하면 안됨.
접근제어자나 static 여부는 상관이 없음.

호출하면 매개변수에 맞는 메소드를 자동으로 찾아줌

오버로딩 된 메소드를 자식 클래스가 오버라이딩 하면?

매개변수가 정확히 일치하는 함수만 오버라이딩함 나머지 오버로딩 된 메소드는 그대로 상속됨.

super 호출

부모의 함수를 특별히 불러야 하는 경우에는 super.methodName() 의 형식으로 호출 할 수 있다.

ex)

class Parent{
    public void sayHi( String name ){
        System.out.println("Hi" + name );
    }
}

class Child extends Parent{
    @Override
    public void sayHi( String name ){
        super.sayHi(name); // 오버라이딩 하고 싶은데 부모 함수는 유지하고 싶은 경우
        System.out.println("Child Class print");
    }
}

상속과 생성자간의 관계

자식의 생성자가 호출되면 부모 생성자는 필수로 호출되어야 한다.
이때 자동 호출되는 경우가 있는데, 부모 클래스의 생성자가 아무런 인자를 받지 않는 경우다.

ex)

class Parent{
    Parent(){}
}

class Child extends Parent{
    Child(){
        /*
        super(); <- 현재 상황에서는 명시적으로 써줘도 되고, 안써줘도 자동으로 호출함
        부모 클래스 생성자가 아무것도 필요하지 않기 때문.

        만약 Parent 생성자가 Parent( int x, int y ){} 처럼 값을 받아야 하는 경우에는
        자동으로 호출되지 않으며, super(x,y);로 인자를 무조건 전달해야 한다.
        호출 안하면 에러남
        */
    }
}

static 변수

클래스와 연관된 변수. 모든 인스턴스가 공유함.
클래스명.static 변수명 또는 인스턴스명.static 변수명 으로 호출 가능.
인스턴스도 static에 접근 할 수 있음 (반면에 클래스는 인스턴스 변수에 접근 불가능함)

인스턴스 변수

클래스 내부에 static이 아닌 변수.
특정 인스턴스가 생길 때 그 하위에 같이 생긴다
인스턴스명.변수명 으로 호출가능