[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
[Java] Call by Value, Call by Reference
이번에는 Call by Value(값에 의한 호출) & Call by Reference(참조에 의한 호출)에 대해 정리할 것이다. 매우 유용한 글을 보아서 그 글을 참고하여 정리하였습니다. Java를 보다 깊게 이해하기 위해 다시
backendcode.tistory.com
javapackage 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로 선언한 것은 상속 가능(같은 패키지안에서라면 사용 가능)
- 내 건 내 거다.(자식 거는 자식 거/부모가 자식 거를 못씀)
- 부모와 자식이 같은 객체를 가지고 있으면 무조건 자식(내 거)을 쓴다.
javapackage 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. 부모꺼는 내꺼다 } }
javapackage 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 이렇게 선언하면 된다.
javapackage 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
javapackage 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년 마무리..!
반응형
블로그의 정보
무작정 개발
무작정 개발