[JAVA+국비교육] 상속, Call By Value, Call By Reference
by 무작정 개발반응형
2021.12.31(9일 차)
벌써 21년 마지막 날이다. 수업 또한 2주 차 마지막이다. 오늘은 몸이 안 좋아 비대면으로 수업을 들었다. 비대면으로
수업을 들으니 2시간은 더 잘 수 있어 매우 좋았다.
오늘의 수업 내용
Call By Value
- Stack 영역의 Heap(힙) 영역으로 데이터가 넘어감.
- 동일 변숫값을 가짐
Call By Reference
- 값을 넘길 때 객체의 시작점 주소가 넘어감
- Heap영역에 있는 데이터를 복사할 때 데이터 자체가 복사되는 게 아니라 주소가 복사되는 것.
- static과 같은 역할을 함
- 동일 주소를 가지고, 주소를 서로 나누어 가짐. ( 이미 만들어진 것을 가져다 쓸 때 사용)
[Java] Call by Value, Call by Reference
package com.day8;
//Call By value
//stack영역의 Heap영역으로 데이가 넘어감
//Call By Reference
//값을 넘길때 객체의 시작점 주소가 넘어감 객체의 값이 하나라 두명의 남자가 전화번호를 서로 나누어 가짐
class Test{
public int x = 10;
//보이지 않는 기본생성자
public void sub(int a) {
x += a;
}
}
public class Test1 {
public static void main(String[] args) {
Test ob = new Test();
//Call by value
int a = 20;
System.out.println("Sub메소드 실행전 x: " + ob.x);
ob.sub(a);
System.out.println("Sub메소드 실행후 x: " + ob.x);
//Call By Reference @중요@
Test ob1; //같은 남자여야해
ob1 = ob;
System.out.println(ob.x); //30
System.out.println(ob1.x);//30
ob1.x = 100;
System.out.println(ob.x); // 100
System.out.println(ob1.x);// 100
}
}
상속 (부모가 자식한테 주는 것)
조건
- 부모 거는 내 거다.
- 부모가 private로 선언한 것은 상속이 불가능하다.
- 부모가 protected로 선언한 것은 상속 가능(같은 패키지안에서라면 사용 가능)
- 내 건 내 거다.(자식 거는 자식 거/부모가 자식 거를 못씀)
- 부모와 자식이 같은 객체를 가지고 있으면 무조건 자식(내 거)을 쓴다.
package com.day8;
//상속(부모가 자식한테 주는 것)
//조건
//1. 부모꺼는 내꺼다.
//2. 부모가 private로 선언한 것은 상속이 불가능하다.
//3. 부모가 protected로 선언한 것은 상속 가능
//4. 내껀 내꺼다.(자식꺼는 자식꺼다 / 부모가 자식거를 못씀)
//5. 부모와 자식이 같은 객체를 가지고 있으면 무조건 자식(내꺼)를 쓴다.
//1
class TestA { //TestA를 부모로 만들고 Rect를 자식으로 만듬
private String title;
private int area; //private로 변수를 만들면 우회도로를 만들어야함/이럴때 변수의 혼동을 막기 위해 this를 사용함.
public void set(String title, int area) { // 메소드로 우회도로 만듬
this.title = title; //초기화
this.area = area; //초기화
}
public void print() {
System.out.println(title +":" + area);
}
}
//2
class Rect extends TestA { //TestA를 부모로 만들고 Rect를 자식으로 만듬
private int w,h; //변수를 초기화하기위해서 우회도로 만들어야함/생성자로 우회도로 (2) w,h에 들어가고
public Rect(int w, int h) { //오버로딩으로 된 생성자로 우회도로 만듬(생성자로 초기화) (1) 10,20이 들어가서
this.w = w;
this.h = h;
}
public void rectArea() {
int a = w*h; // (3) 여기서 계산해서 200이되고
set("사각형", a); //1. 부모는 내꺼다
}
}
//3
public class Test2 {
public static void main(String[] args) {
Rect ob = new Rect(10, 20);
ob.rectArea();
ob.print();//1. 부모꺼는 내꺼다
}
}
package com.day8;
//상속(부모가 자식한테 주는 것)
//조건
//1. 부모꺼는 내꺼다. (할아버지꺼도 내꺼다) 메소드 가져와서 이용가능
//2. 부모가 private로 선언한 것은 상속이 불가능하다.
//3. 부모가 protected로 선언한 것은 상속 가능
//4. 내껀 내꺼다. (자식꺼는 자식꺼다 / 부모가 자식거를 못씀)
//5. 부모와 자식이 같은 객체를 가지고 있으면 무조건 자식(내꺼)를 쓴다.
//1
class TestB { //TestB를 부모로 만들고 RectB를 자식으로 만듬
private String title;
protected int area; //3. 부모가 protected로 선언한 것은 상속 가능 @중요@ Test2에서는 pivate로 하는 방법
public void set(String title) { // 메소드로 우회도로 만듬
this.title = title; //초기화
}
public void print() {
System.out.println(title +":" + area);
}
}
//2
class RectB extends TestB { //TestA를 부모로 만들고 Rect를 자식으로 만듬
private int w,h; //변수를 초기화하기위해서 우회도로 만들어야함/생성자로 우회도로 (2) w,h에 들어가고
public RectB(int w, int h) { //오버로딩으로 된 생성자로 우회도로 만듬(생성자로 초기화) (1) 10,20이 들어가서
this.w = w;
this.h = h;
}
public void rectArea() {
area = w*h; // (3) 여기서 계산해서 200이되고
set("사각형"); //1. 부모는 내꺼다
}
}
//3
public class Test3 {
public static void main(String[] args) {
RectB ob = new RectB(10, 20);
ob.rectArea();
ob.print();//1. 부모꺼는 내꺼다
}
}
상속을 할 때 'extend'를 써서 부모와 자식을 연결해줌.
ex) RectB클래스(자식)에 TestB(부모)를 상속받고 싶다면
-> class RectB extends TestB 이렇게 선언하면 된다.
package com.day8;
class TestC {
private String title;
protected int area;
public TestC() { //기본생성자
}
public TestC(String title) {
this.title = title;
}
public void print() {
System.out.println(title + ":" + area);
}
}
class RectC extends TestC {
private int w, h; //생성자로 초기화 constructor(생성자) / 오류에 proterty라는 말이 나오면 메서드 오류
public RectC(int w, int h) {
super("사각형");
this.w = w;
this.h = h;
}
public void rectArea() {
area = w*h;
}
}
public class Test4 {
public static void main(String[] args) {
RectC ob = new RectC(10,20);//
ob.rectArea();
ob.print();
}
}
Q. 퀴즈풀이
1번
인원수를 입력받아 인원수만큼 과목별 점수를 입력하고 각 과목별 판정을 하시오
인원수 : 2
1번째 이름 : 전지현
국어? : 100
영어? : 100
수학? : 100
1번째 이름 : 옥주현
국어? : 80
영어? : 80
수학? : 80
package rank2;
import java.util.Scanner;
class Start {
private String name;
private int kor, eng, mat;
//입력부분
public void input() {
Scanner sc = new Scanner(System.in);
System.out.print("이름 국어 영어 수학 : ");
name=sc.next();
kor=sc.nextInt();
eng=sc.nextInt();
mat=sc.nextInt();
}
//처리 부분
public String result(int jum) {
String list = "";
switch(jum) {
case(100) : case(90) :
list = "수";
break;
case(80) :
list = "우";
break;
case(70) :
list = "미";
break;
case(60) :
list = "양";
break;
default :
list = "가";
break;
}
return list;
}
//출력 부분
public void print() {
System.out.printf("%5s %4d(%s), %4d(%s), %4d(%s)\n", name, kor, result(kor), eng, result(eng), mat, result(mat));
}
}
public class Ranking {
public static void main(String[] args) {
Start st = new Start();
st.input();
st.print();
}
}
2021년 마무리..!
반응형
'Language > Java' 카테고리의 다른 글
[JAVA+국비교육] Wrapper 클래스, Calendar 클래스(만년달력), 추상클래스, final (0) | 2022.01.04 |
---|---|
[JAVA+국비교육] 상속, Object 클래스, 생성자, Override, super(), 클래스를 활용해서 계산기 만들기 (0) | 2022.01.03 |
[JAVA+국비교육] static, this, 변수 초기화 방법, Overloading, 생성자 (0) | 2021.12.30 |
[JAVA+국비교육] 클래스(Class), 객체 지향(OOP) 시작! (0) | 2021.12.30 |
[JAVA+국비교육] 배열 기초 (0) | 2021.12.30 |
블로그의 정보
무작정 개발
무작정 개발