코드 그라데이션

후발대 8일차 본문

Java/후발대

후발대 8일차

완벽한 장면 2023. 1. 14. 13:00

Getter / Setter / 상속

개념설명

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이 꼭존재한다. 

------------------


상속
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{}


예제 1,2 를 통해 문법과 객체지향의 관점과 클래스 작성, 코드의 동작과 흐름에 대한 이해도를 
높여보자. (captionTv / Parent /Child/ Inheritance)

 

수업 코드

public class Course {
    private String title;
    private String tutor;
    private int days;
}

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

// 생성자
public Course(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;
        }

}


--
// 메인클래스
public class Prac08 {
    public static void main(String[] args) {

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

// 아래와 같이 값을 넣을때는 setter메서드를 통해 작성 
        Course course = new Course();
				 course.setTitle(title);
         course.setTutor(tutor);
         course.setDays(days);
    
           // 인쇄해보기, 값을 가져올때도 아래와 같이 메서드를 가져와서 출력 
         System.out.println(course.getTitle(title));
         System.out.println(course.getTutor(tutor));
         System.out.println(course.getDays(days));

   
			
    }
}

--------------------------------------------------------------------------
    // 퀴즈 1: 응용과 실습 (클래스와 메소드)
    // 1) Book 클래스를 만들고, 도서명(title)과 지은이(author), 출판사(publisher) ,가격(price) 멤버변수를 추가하세요.
    // 2) 그리고 각 변수를 private 선언하고, Getter와 Setter를 만들어 보세요.
    // 3) 마지막으로, 기본생성자와 title/ author/ price 입력받는 생성자 두개를 만들어 보세요.
    // 4) 메인클래스(Prac)에서 변수선언하여 값을 넣고, 인스턴스를 만들어 보세요.
    // setter을 이용하여 값을 넣는 문법을 구현하고 getter를 활용하여 책 한권의 정보를
    // 출력하는 화면을 구현합니다.
    
    --------------------------------------------------------------------------
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;
    }
    // 사실 게터와 세터 선언하는 순서는 상관이 없다.
}
    --------------------------------------------------------------
    실습 1 Prac클래스)
    
    public class Prac {
        public static void main(String[] args) {
    
            String title = "코스모스";
            String author = "칼 세이건";
						String publisher = "ABC";
            int price = 30000;
            
            Book book = new Book();
            book.setTitle(title);
            book.setAuthor(author);
			book.setPublisher(publisher);
            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));
    
        }
    }
    
    ----
 상속 : 키워드는 extends

    
상속
class Parent{}
class Child extends Parent{}

예) 
class Parent{
int age;
}

class Child extends Parent{
}

클래스 | 클래스의 멤버
Parent | age
Child  | age

---------------------------------------------------------

class Parent{
int age;
}

class Child extends Parent{
void play() {
	System.out.println("놀자~~");
  }
}




------
// 예제) Tv와 CaptionTv

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

    void power() {
        power = !power;
    }

    void channelUp() {
        ++channel;
    }

    void channelDown() {
        --channel;
    }
}

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

		// 메소드
    void displayCaption(String text) {
        if (caption) { // 캡션상태가 on(true)일때만 text를 보여 준다.
            System.out.println(text);
        }
    }
}

class Prac08 {
    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");
    }
}



// 코드로 이해해 보는 시간 Parent, Child, Inheritance class
public class Parent {

//	protected 접근 권한은 현재 클래스와 현재 클래스를 상속받은 자식 클래스에서만 접근 가능
		protected String name;
    protected boolean gender;

    public Parent() {
        this("무명", false);
    }
    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 ? "남" : "여") + ")";
    }
}

----------------------------------
public class Child extends Parent {

//	Child 클래스에는 Parent 클래스의 모든 멤버 변수와 메소드를 사용할 수 있다.
//	Child 클래스에서 필요한 기능을 정의한다.

    private int age;
    private String nickname;

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



    public Child(String name, boolean gender, int age, String nickname) {
        super(name, gender);
        this.age = age;
        this.nickname = nickname;
    }

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

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

}
----------------------------------------------------------------------
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);

    }

}
728x90

'Java > 후발대' 카테고리의 다른 글

후발대 9일차 개념정리  (0) 2023.01.16
후발대 9일차 전체 코드  (0) 2023.01.16
후발대 7일차  (0) 2023.01.14
후발대 6일차  (0) 2023.01.14
후발대 5일차  (1) 2023.01.14
Comments