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.name에name값 갱신 - 이후 갱신된 값 사용 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)로 넘겨야 부모 클래스에서 초기화할 수 있음.