생각정리/항해99

[프로그래밍 기초] Java문법 2일차

생각중임 2023. 8. 15. 22:55

Java문법 종합반 3 주차


클래스

변수, 생성자 메서드로 구성

기본 생성자는 적지 않아도 기본으로 생성되어 있다. ( 생성자를 만들어주면 기본 생성자는 생성되지 않는다.)

public class Car {
    public String company; // 자동차 회사
    public String model; // 자동차 모델
    private String color; // 자동차 색상
    public double price; // 자동차 가격
    public double speed;  // 자동차 속도 , km/h
    public char gear; // 기어의 상태, P,R,N,D
    public boolean lights; // 자동차 조명의 상태

    public Car() {} // 기본 생성자
    
    Public Car(String model) { // this를 이용한 생성자
    	this(model, "Blue"); // this생성자는 가장먼저 사용해야한다.
    }
    
    public Car(String model, String color) {
    	this.model = model;
        this.color = color;
    }

    public double gasPedal(double kmh) {
        this.speed = kmh;
        return speed;
    }

    public void horn() {
        System.out.println("빵빵");
    }
}

객체의 사용

클래스를 객체로 생성하여 사용한다.

객체는 참조형 변수와 동일하게 배열 또는 컬랙션에 사용가능하다.

객체라는 개념을 잘 이해해야 나중에 헷갈리지 않을 것 같다.

public class Main {
    public static void main(String[] args) {
        Car[] carArray = new Car[3];
        Car car1 = new Car();
        car1.changeGear('P');
        carArray[0] = car1;
        
        Car car2 = new Car();
        car2.changeGear('N');
        carArray[1] = car2;
        
        Car car3 = new Car();
        car3.changeGear('D');
        carArray[2] = car3;

        for (Car car : carArray) {
            System.out.println("car.gear = " + car.gear);
        }
    }
}

접근 제어자

클래스, 메서드, 변수등에 사용되는 접근에 대한 제한을 설정할 수 있다.

접근 제어자를 별도로 설정하지 않으면 변수나 메서드는 default 접근 제어자가 자동으로 설정된다.

사용가능한 접근 제어자와 사용가능한 제어자가 따로 있었나? 다른 강의들을 비교해 보면서 다시 확인해 봐야겠다

※추가 - 말하는 문제였다. 그냥 사용가능 제어자는 접근 제어자 + 기타 제어자를 포함해서 같이 보여주면서 말했던 것

// 접근 제어자
// public : 접근 제한이 전혀없음
// protected : 같은 패키지의 클래스 또는 해당 클래스를 상속받은 클래스에서 접근이 가능
// default : 같은 패키지 내에서만 접근이 가능
// private : 해당 클래스 내에서만 접근이 가능

// 사용가능한 접근 제어자
// 클래스 : public, default
// 메서드 & 멤버변수 : public, protected, default, private
// 지역변수 : 없음

// 사용가능한 제어자 (기타제어자 final, static, abstract 포함)
// 클래스 : public, default, final, abstract
// 메서드 : public, protected, default, private, final, abstract, static
// 멤버변수 : public, protected, default, private, final, static
// 지역변수 : final

클래스 상속

java는 다중상속을 허용하지 않는다.

상속은 이제 추상 클래스와 인터페이스에도 사용되므로 개념 정리를 잘해두자.

public class 자식클래스 extends 부모클래스 {

}
public class SportsCar extends Car{
    String engine;
    public void booster() {
        System.out.println("엔진 " + engine + " 부앙~\n");
    }
}

추상 클래스

abstract를 사용하여 선언한다.

추상 클래스는 추상 메서드를 포함한다. ( 추상 메서드가 없는 건 상관없다. )

클래스를 잘 활용하기 위해서 잘 알아둬야 한다.

// 추상 클래스 선언
public abstract class 추상클래스명 {
        abstract 리턴타입 메서드이름(매개변수, ...);
}
public abstract class Car {
    String company; // 자동차 회사
    String color; // 자동차 색상
    double speed;  // 자동차 속도 , km/h

    public double gasPedal(double kmh) {
        speed = kmh;
        return speed;
    }

    public double brakePedal() {
        speed = 0;
        return speed;
    }

    public abstract void horn();
}

// 추상 클래스 상속
public class 클래스명 extends 추상클래스명 {
    @Override
    public 리턴타입 메서드이름(매개변수, ...) {
        // 실행문
    }
}
public class ZenesisCar extends Car {

    @Override
    public void horn() {
        System.out.println("Zenesis 빵빵");
    }
}

인터페이스

모든 멤버변수는 public static final이다. (생략 가능)

모든 메서드는 public abstract이다. (생략 가능)

인터페이스 간에는 상속(extends)을 하고 클래스에는 구현(implements) 하는 걸 잘 구분해야 된다.

set, list, map 등이 인터페이스로 구현되어 있다.

// 인터페이스 선언
public interface 인터페이스명 { 
    public static final char A = 'A';
    static char B = 'B';
    final char C = 'C';
    char D = 'D';

    void turnOn(); // public abstract void turnOn();
}

// 인터페이스 구현
public class 클래스명 implements 인터페이스명 { 
    // 추상 메서드 오버라이딩
    @Override
    public 리턴타입 메서드이름(매개변수, ...) {
    	// 실행문
    }
}

// 인터페이스 상속
public interface 인터페이스명 extends 인터페이스명2, 인터페이스명3... { 
    // 추상 메서드 오버라이딩
    @Override
    public 리턴타입 메서드이름(매개변수, ...) {
        // 실행문
    }
}