코드 그라데이션

후발대 8일차 클래스별 깔끔하게 정리 본문

Java/후발대

후발대 8일차 클래스별 깔끔하게 정리

완벽한 장면 2023. 1. 17. 09:17

Book

package Prac08;

public class Book {
    public String title;
    public String author;
    public String publisher;
    public int price;

    public Book() {
    }
    public Book(String title, String author, String publisher, int price) {
        this.title = title;
        this.author = author;
        this.publisher = publisher;
        this.price = price;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getTitle(String title) {
        return this.title = title;
    }

    public String getAuthor(String author) {
        return this.author = author;
    }

    public String getPublisher(String publisher) {
        return this.publisher = publisher;
    }

    public int getPrice(int price) {
        return this.price = price;
    }
}

 

Child

package Prac08;

public class Child extends Parent {


//	Child 클래스에는 Parent 클래스의 모든 멤버 변수와 메소드를 사용할 수 있다.
//	Child 클래스에서 필요한 기능을 정의한다.
// 지금 Parent를 상속받았기 때문에, name과 gender는 안 써줘도 된다!

    private int age;
    private String nickname;

    public Child() {

        super(); // 이 기능을 통해서 부모클래스의 기본생성자에 존재하는 내용을 가지고 올 수 있다.
//		super()가 있으면 자식 클래스의 생성자가 실행되기 전에 부모 클래스의 생성자가 먼저 실행된다.
//		자식 클래스의 생성자에 별도의 설정을 하지 않으면 무조건 첫 줄에 부모 클래스의 기본 생성자를 실행하는 super()를
//		자바 컴파일러가 자동으로 붙여준다.
//		super()를 생략한 경우 부모 클래스에 기본 생성자가 존재하지 않으면 에러가 발생되니 주의한다.
    }



    public Child(String name, boolean gender, int age, String nickname) { // 부모클래스에 있으므로!
        super(name, gender);
        this.age = age;
        this.nickname = nickname;
        // 파라미터 4개짜리 생성자 완성!
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    //	Override(재정의): 부모 클래스로 부터 상속받은 메소드의 기능을 무시하고 다시 만들어 사용한다.
    @Override
    public String toString() {

//		부모 클래스에서 상속받은 멤버 변수의 접근 권한이 protected일 경우 자식 클래스에서 접근할 수 있으므로
//		멤버 변수의 내용을 얻어올 수 있다.
// 이름 (남) - 7 , 별명 형식으로 출력하려고 한다면 아래와 같이 코드를 작성해 주면 된다.
        return name + "(" + (gender ? "남" : "여") + ") - " + age + ", " + nickname;
    }

}

 

Course08

package Prac08;

public class Course08 {
    private String title;
    private String tutor;
    private int days;


    // 기본생성자
    public Course08(){}

    // 생성자
    public Course08(String title, String tutor, int days) {
        this.title =title;
        this.tutor =tutor;
        this.days =days;
    }

    //Setter
    public void setTitle(String title) {
        this.title = title;
    }

    public void setTutor(String tutor) {
        this.tutor = tutor;
    }
    public void setDays(int days) {
        this.days = days;
    }

    // Getter
    public String getTitle() {
        return this.title = title;
    }

    public String getTutor() {
        return this.tutor = tutor;
    }

    public int getDays() {
        return this.days = days;
    }

}

 

Inheritance

package Prac08;

public class Inheritance {
    public static void main(String[] args) {

        Parent parent = new Parent();
        System.out.println(parent);
        Parent parent2 = new Parent("고길동", true);
        System.out.println(parent2);
        System.out.println("=======================");

        Child child = new Child();
        System.out.println(child);
        Child child2 = new Child("둘리", true, 6, "호잇");
        System.out.println(child2);
    }
}

 

Parent

package Prac08;

public class Parent {
    //	protected 접근 권한은 현재 클래스와 현재 클래스를 상속받은 자식 클래스에서만 접근 가능
    protected String name;
    protected boolean gender; // 트루펄스로 남녀를 구별

    public Parent() {
        this("무명", false); // 아무것도 안 적었을 때, 출력할 defalut값을 이처럼 설정해줄 수도 있음.
    }
    public Parent(String name, boolean gender) {
        this.name = name;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public boolean isGender() {
        return gender;
    }
    public void setGender(boolean gender) {
        this.gender = gender;
    }

    // 김르탄(남) 과 클래스로 생성한 객체 정보를 출력하고 싶을때 (예쁘게 값을 가져오고 싶음)
    @Override
    // toString 메서드는 최상위 클래스인 Object 클래스에 속해있는 메서드
    //"toString" 메서드는 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 메소드
    // 모든 클래스를 만들때 오브젝트 클래스를 상속받아 만들지는 않지만 오브젝트 클래스의 하위클래스에 만들어 진다.

    public String toString() {
//		조건식 ? 조건이 참일 때 실행할 문장 : 조건이 거짓일 때 실행할 문장
        return name + "(" + (gender ? "남" : "여") + ")"; // 삼항연산자로 true, false 나오게 하면 보기가 더 편하지.
    }
}

 

Day08(메인클래스)

package Prac08;

public class Day08 {
   
--------------------------------------
개념설명
getter/setter
클래스에는 개인정보와 같이 민감하고 중요한 정보가 많이 있기 때문에 함부로 접근하고 값을 변경
하지 않도록 최소한의 허들을 두어야 하는데요.
지난시간에 배웠던 접근제어자 를 통해 해당 클래스의 접근 범위를 설정할 수 있었습니다.
일반적으로 멤버변수는 private로 설정이 되고,
해당 클래스의 인스턴스 생성시 값을 변경하거나 가져올때에는
클래스의 해당메서드를 통해서만 그 기능을 할 수 있도록 하고 있습니다.

따라서 접근제어자가 private 인 경우, 어떻게 다른 클래스에서 인스턴스를 생성하고
객체의 값을 넣고 가져오는지
getter/ setter 문법을 복습해 보도록 하는 시간입니다.

// setter
// 메서드 (public)
public 반환타입 메서드명 (파라미터) {
    예) this.title=title;
}

// setter 는 클래스의 객체를 활용해 값을 저장하는 것이므로
// setter 작성시 따로 반환타입(돌려줄값)은 없습니다.
// 메서드명은 관습적으로 setTitle;과 같은 형식으로 작성하고 있습니다.

예)
public void setTitle(String title) {
    this.title= title;
}


// getter
public String getTitle(String title) {
		return this.title= title;
}
// 값을 반환해 주는 것이므로 반환타입이 있다.
// 값을 반환해 주므로 return이 꼭존재한다.

    public static void main(String[] args) {

        String title = "Spirng";
        String tutor = "남병관";
        int days =35;

// 아래와 같이 값을 넣을때는 setter메서드를 통해 작성
        Course08 course = new Course08();
        course.setTitle(title);
        course.setTutor(tutor);
        course.setDays(days);

        // 인쇄해보기, 값을 가져올때도 아래와 같이 메서드를 가져와서 출력
        System.out.println(course.getTitle());
        System.out.println(course.getTutor());
        System.out.println(course.getDays());
    }

--------------------------------------
    // 퀴즈 1: 응용과 실습 (클래스와 메소드)
    // 1) Book 클래스를 만들고, 도서명(title)과 지은이(author), 출판사(publisher) ,가격(price) 멤버변수를 추가하세요.
    // 2) 그리고 각 변수를 private 선언하고, Getter와 Setter를 만들어 보세요.
    // 3) 마지막으로, 기본생성자와 title/ author/ price 입력받는 생성자 두개를 만들어 보세요.
    // 4) 메인클래스(Prac)에서 변수선언하여 값을 넣고, 인스턴스를 만들어 보세요.
    // setter을 이용하여 값을 넣는 문법을 구현하고 getter를 활용하여 책 한권의 정보를
    // 출력하는 화면을 구현합니다.


    public static void main(String[] args) {
        String title = "데미안";
        String author = "헤르만 헤세";
        String publisher = "민음사";
        int price = 20000;

        Book book = new Book();
        book.setTitle(title);
        book.setAuthor(author);
        book.setAuthor(author);
        book.setPrice(price);

        System.out.println(book.getTitle(title));
        System.out.println(book.getAuthor(author));
        System.out.println(book.getTitle(publisher));
        System.out.println(book.getPrice(price));

    }


------------------------------
    /*
상속
OOP(객체지향)의 4대 원칙으로는 캡슐화, 상속, 다형성, 추상화가 있습니다.
캡슐화의 예로 접근제어자(은닉화)를 배웠고,
다음으로는 상속에 대한 문법과 이해도를 높이고자 실습을 하는 시간을 갖도록 합니다.

상속의 특징

class Parent{}
class Child extends Parent{}

예)
class Parent{
int age;
}

class Child extends Parent{
}

클래스 | 클래스의 멤버
Parent | age
Child  | age, play()
-------------------------------------------------------

- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다. (정확한 설명)
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
- 여러클래스를 한번에 상속 받을 수 없다.
- 아래와 같이 여러 클래스가 한 부모의 클래스를 상속받을 수 있다. (상속의 상속은 가능)
. 단일 상속의 법칙이 있음
. 하나의 클래스는 하나의 부모만을 상속 받을 수 있다.


class Parent{}
class Child extens Parent{}
class Child2 extens Parent{}
*/

--------------------------------------------
    class Tv1 {
        boolean power; //전원(on/off)
        int channel; // 채널

        void power() {
            power = !power;
        }

        void channelUp() {
            ++channel;
        }

        void channelDown() {
            --channel;
        }
    }

    // 자막 tv
    class captionTv extends Tv1 {
        // 추가로 필요한 멤버변수를 작성.
        boolean caption;

        // 메소드
        void displayCaption(String text) {
            if (caption) { // 캡션상태가 on(true)일때만 text를 보여 준다.
                System.out.println(text);
            }
        }
    }
            public static void main(String[] args) {
            captionTv ctv = new captionTv();
            ctv.channel = 10;
            ctv.channelUp();
            System.out.println(ctv.channel);
            ctv.displayCaption("Hello, World");
            ctv.caption = true;
            ctv.displayCaption("Hello, World");
        }
    }
    상속의 예시인데, 에러나는 원인을 잘 모르겠어, 일단 넘어가자
}

 

728x90
Comments