9주 차 자바 수업 - SangwooRyou/26_Java GitHub Wiki

활동지

활동 1

이름과 3가지 과목의 점수를 받아 생성자와 메소드를 이용하는 코드.

생성자 부분

	String name;
	int java, web, os;

	// 인자 생성자 (매개 변수 3개)
	public Grade(String name, int java, int web, int os) {
		this.name = name;
		this.java = java;
		this.web = web;
		this.os = os;
	}

	// 이름을 반환하는 getName() 메소드 정의
	public String getName() {
		return name;
	}

	// 평균을 계산해서 정수로 반환하는 getAverage() 메소드 정의
	public int getAverage() {
		int sum = java + web + os;
		int avg = sum / 3;
		return avg;
	}
  • 클래스 내부에선 변수의 값을 공유하기에 생성자 호출 → this.namename 값 갱신
  • 이후 갱신된 값 사용 in method 메인 메소드
public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.print("이름, 자바, 웹 프로그래밍, 운영체제 순으로 점수 입력 >> ");
		String name = scanner.next();
		int java = scanner.nextInt();
		int web = scanner.nextInt();
		int os = scanner.nextInt();
		Grade st = new Grade(name, java, web, os); // 객체 생성
		System.out.println(st.getName()+"의 평균은 "+st.getAverage());
		scanner.close();
	}
  • Scanner를 통해 이름, 3가지 과목의 점수를 입력 받음.
  • 이후 입력 받은 값을 통해 객체를 만듦.
  • 메소드 호출은 st.method()

Input, Output

이름, 자바, 웹 프로그래밍, 운영체제 순으로 점수 입력 >> 홍길동 80 90 100
홍길동의 평균은 90

활동 2

1개의 메모 정보를 담는 Memo 클래스 작성.

생성자 부분

String name, type, content;
	
	public Memo(String name, String type, String content) {
		this.name = name;
		this.type = type;
		this.content = content;
	}
	
        // 같은 사람이 작성한 글인지 판별
	public boolean isSameName(Memo b) {
		if(name.equals(b.getName())) return true;
		else return false;
	}

	// 이름 반환
	public String getName() {
		return name;
	}
	
        // 내용 길이 반환
	public int length() {
		return content.length();
	}
	
        // 내용 출력
	public void show() {
		System.out.println("=== 메모 정보 ===");
		System.out.println(name);
		System.out.println(type);
		System.out.println(content);
	}

메인 메소드

public static void main(String[] args) {
		Memo a = new Memo("유송연", "10:10", "자바 과제 있음");
		Memo b = new Memo("박채원", "10:15", "시카고로 어학 연수가요!");
		Memo c = new Memo("김경미", "11:30", "사랑하는 사람이 생겼어요.");
		a.show();
		if(a.isSameName(b)) System.out.println("동일한 사람입니다.");
		else System.out.println("다른 사람입니다.");
		System.out.println(c.getName() + "가 작성한 메모의 길이는 " + c.length());
	}

Output

==== 메모 정보 ====
유송연
10:10
자바 과제 있음
다른 사람입니다.
김경미가 작성한 메모의 길이는 14

final

  • final class는 상속 불가!
  • final method는 오버라이딩 불가!
  • 마지막 후손이기 때문에 아래가 있으면 안 됨. (상수 표현법)

객체 지향의 특징

1. 캡슐화 💊

  • 객체를 캡슐로 싸서 외부로부터 내부를 보호.
  • 정보 은닉.

자바의 캡슐화

  • 메소드와 필드를 모두 클래스 내에 구현.
  • 클래스가 바로 객체 모양을 선언한 틀!
private String name;
private int age;
  • Animal 클래스에서 이런 식의 코드가 있을 때
Animal cat = new Animal();
cat.name = "뽀삐" // 접근 불가
  • 외부 클래스에서 접근할 수 없음.
	public void setName(String name) {
		this.name = name;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
  • 따라서 위와 같이 setter 메소드를 만들고,
cat.setName("뽀삐");
cat.setAge(10);
  • 메소드를 통해 호출해야 함.
  • 같은 원리로 getter 메소드를 만들어 사용 가능.
  • (단, getter는 return하는 메소드)

2. 상속 🌟

  • 상위 개체의 속성이 하위 개체에 물려짐.
  • 부모 클래스 : 수퍼 클래스
  • 자식 클래스 : 서브 클래스 (수퍼 클래스 재사용 + 새로운 특성 추가)
package day09;

public class Human {
	private String name, addr;
	private int age;
	
	// getter 
	public String getName() {
		return name;
	}
	public String getAddr() {
		return addr;
	}
	public int getInt() {
		return age;
	}
	
	// setter 
	
	public void eat() {}
	public void sleep() {}
	public void love() {}
}
  • Animal 클래스에 있는 정보들을 똑같이 선언...
  • extends 키워드를 통해 상속 가능.
public class Human extends Animal{
	private String addr;
	
	public String getAddr() {
		return addr;
	}
	
	public void setAddr(String addr) {
		this.addr = addr;
	}
}
  • 추가된 항목 addr에 대한 메소드만 정의해 주면 됨! → 중복 코드를 줄일 수 있음.
Human hong = new Human();
hong.setName("홍길동");
hong.setAge(20);
hong.setAddr("조선");
System.out.println(hong.getName());
System.out.println(hong.getAge());
System.out.println(hong.getAddr());
  • 부모의 변수에 접근할 땐 super를 통해 가능하며, 상속을 받더라도 부모의 변수가 private면 직접 다룰 수 없음.
  • 따라서 super(arg1, arg2)로 넘겨야 부모 클래스에서 초기화할 수 있음.