Java 강의 #2 클래스/메소드/생성자/상속

김춘복·2023년 2월 9일
0

Java 공부

목록 보기
2/20

객체지향언어

클래스

  • 클래스 : 표현하고자 하는 대상의 공통속성을 한군데 정의해놓은것. 객체의 속성을 정의해놓은것.
    클래스가 붕어빵틀이라면.
  • 인스턴스 : 어떤 붕어빵틀(클래스)로 찍어낸 붕어빵. 어떠한 클래스로부터 만들어진 객체
  • 멤버변수 : 클래스 내부의 정보
class Phone {
    String model; 
    String color;
    int price;
} // phone이라는 클래스를 정의. phone은 model color price의 속성(멤버변수)을 가짐.

public class Main {
    public static void main(String[] args) {
        Phone galaxy = new Phone(); // phone 클래스에 해당하는 "galaxy" 이름 가진 객체 생성
        galaxy.model = "Galaxy10"; 
        galaxy.color = "Black";
        galaxy.price = 100;
        
        Phone iphone =new Phone(); //phone 클래스에 해당하는 iphone이란 이름을 가진 객체 생성
        iphone.model = "iPhoneX";
        iphone.color = "Black";
        iphone.price = 200;
        

        System.out.println("철수는 이번에 " + galaxy.model + galaxy.color + " + 색상을 " + galaxy.price + "만원에 샀다.");
        System.out.println("영희는 이번에 " + iphone.model + iphone.color + " + 색상을 " + iphone.price + "만원에 샀다.");
    }
}

새로운 인스턴스 만들 시 클래스 새인스턴스명 = new 클래스();로 선언.
새인스턴스명.멤버변수 = 멤버값;으로 멤버변수 할당
새인스턴스명.멤버변수를 그냥 쓰면 거기 할당 된 값을 불러옴.


메소드

  • 메소드(Method) : 어떤 작업을 수행하는 코드를 하나로 묶어놓은 것. 함수와 비슷

  • 메소드가 필요한 이유

  1. 재사용성 : 메소드를 만들면 이후 반복적으로 재사용 가능. 다른프로그램에서도 사용 가능
  2. 중복된 코드를 메소드를 활용해 제거. 효율적인 코드
  3. 프로그램 구조화
int[] heights = new int[5];

initHeight(heights);
sortHeight(heights);
printHeight(heights);

메소드를 만들 때 이름을 잘 지으면 메소드 안을 안살펴봐도 한눈에 볼 수 있어 좋다. 이를 readability표현이 좋다고 한다. 메소드는 동사로 시작해야되고 camelCase로 작성해야함!!

  • 메소드 선언 방법
int add(int x, int y) {	
    int result = x + y;
    return result;
} 

여기서 맨 처음 int는 메소드의 결과값이 전달되는 타입. return type
메소드(add) 이름 뒤에 괄호치고 나오는 int x와 int y 는 parameter
파라미터는 원하는 만큼 쓸 수 있다.

class Calculation {
    int add(int x, int y) {
        int result = x + y;
        return result;
    }// 두 값을 더한 결과

    int subtract(int x, int y) {
        return x - y;
    }// 두 값을 뺀 결과 
}

public class Main {
    public static void main(String[] args) {
        Calculation calculation = new Calculation();
        int addResult = calculation.add(100, 90);
        int subResult = calculation.subtract(90, 70);

        System.out.println("두 개를 더한 값은 " + addResult);
        System.out.println("두 개를 뺀 값은 " + subResult);
    }
}

생성자

  • 생성자 : 인스턴스가 생성될 때 사용되는 '인스턴스 초기화 메소드'. 클래스에 구현.
    new와 같은 키워드로 해당 클래스의 인스턴스가 새로 생성될 때, 자동으로 호출되는 메소드다.
    대표적으로 인스턴스 변수를 초기화 하는 용도로 사용한다.

  • 생성자의 형식

클래스이름 (타입 변수명, 타입 변수명, ...){
    인스턴스 생성 될 때에 수행하여할 코드
    변수의 초기화 코드
}
  • 생성자의 조건 : return값이 없다. 생성자의 이름은 class명과 같아야한다.
    모든 클래스에는 하나이상의 생성자가 반드시 있어야한다!(없으면 컴파일러가 기본생성자 알아서 만들어주긴함)

  • 예시

class Phone {
    String model;
    String color;
    int price;

//아래가 생성자. 생성자에서 사용된 this는 생성된 객체 자신.
    Phone(String model, String color, int price) { //생성자 이름은 클래스명과 동일
        this.model = model; //첫번째 model이 위에꺼. 두번째 model이 생성자에꺼.
        this.color = color;
        this.price = price;
    }
}

public class Main {
    public static void main(String[] args) {
        Phone galaxy = new Phone("Galaxy10", "Black", 100);
// 생성자 만들었으면 괄호()안에 새인스턴스의 멤버변수 넣으면 됨.
        Phone iphone =new Phone("iPhoneX", "Black", 200);
// 위에 예시에서 길었던 코드들이 생성자 덕에 1줄로 간결해짐.
        System.out.println("철수는 이번에 " + galaxy.model + galaxy.color + " + 색상을 " + galaxy.price + "만원에 샀다.");
        System.out.println("영희는 이번에 " + iphone.model + iphone.color + " + 색상을 " + iphone.price + "만원에 샀다.");
    }
}
  • this는 생성된 객체 자신. super는 내가 상속받은 부모의 클래스

  • 윈도우 기준 alt+insert 누르면 constructor 클릭하고 shift+클릭으로 메인변수 다 지정하면 빠르고 간편하게 생성자 구축 완료.

  • class의 변수는 생성자를 통해 초기화를 하지 않는다면 기본값을 가진다.
    정수는 0, 실수는 0.0, boolean은 false, String은 null(아무런 값이 없는 상태)
    byte는 0(숫자 0이 아니라 8비트가 모두 false기때문에)


상속

  • 상속을 보여주는 UML Class Diagram
    상속이미지

위의 car를 부모 class. 아래의 suv sedan이 자식(child) class

  • 상속을 통해 기존의 클래스를 재사용할 수 있다. 클래스간 계층구조가 생긴다.

  • 상속의 특징

  1. 부모 클래스에서 정의된 필드와 메소드를 물려 받는다.
  2. 새로운 필드와 메소드를 자식 class에 추가할 수 있다.
  3. 부모 클래스에서 물려받은 메소드를 수정할 수 있다.(method overriding)
  • 상속의 형식 : extends를 통해 상속받는다
class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}

Animal이 부모. 그 밑에 dog cat이 자식 class

  • 상속받을때 여러 클래스를 받을 수는 없다. 오직 하나의 class만 상속받을 수 있다.

  • 자식 객체는 자식 타입 변수에도 할당할 수 있고, 부모 타입 변수에도 할당할 수 있다.
    하지만 부모 타입 변수로 사용할 때는 자식 타입의 메소드(함수)는 쓸 수 없다.

오버로딩 & 오버라이딩

  • 오버로딩(Overloading) : 한 클래스 내에 동일한 이름의 메소드를 여러개 정의하는 것

  • 조건 : 메소드 이름이 동일. 매개변수의 개수 or 타입(int long String 등)이 달라야한다.
    (단, return type이 다른걸로는 오버로딩 x)


  • 오버라이딩(Overriding) : 부모 클래스로부터 상속받은 메소드의 내용을 변경
    이때 부모에 있는 똑같은 메소드를 자식이 구현해서 부모의 메소드를 없는 체 한다.
    헷갈리지 않게 위에다 @Override라고 붙여두기도 한다.

  • 조건 : 부모 클래스의 메소드와 이름, 매개변수, 반환타입이 같아야한다.

profile
Backend Dev / Data Engineer

0개의 댓글