무작정 개발.Vlog

[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

java
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
}
}
Test 1 실행 결과
Test 1 실행 결과

상속 (부모가 자식한테 주는 것)

조건

  1. 부모 거는 내 거다.
  2. 부모가 private로 선언한 것은 상속이 불가능하다.
  3. 부모가 protected로 선언한 것은 상속 가능(같은 패키지안에서라면 사용 가능)
  4. 내 건 내 거다.(자식 거는 자식 거/부모가 자식 거를 못씀)
  5. 부모와 자식이 같은 객체를 가지고 있으면 무조건 자식(내 거)을 쓴다.
java
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. 부모꺼는 내꺼다
}
}

 

java
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. 부모꺼는 내꺼다
}
}
Test 2 실행 결과
Test 2 실행 결과

상속을 할 때 'extend'를 써서 부모와 자식을 연결해줌. 

ex) RectB클래스(자식)에 TestB(부모)를 상속받고 싶다면 

-> class RectB extends TestB      이렇게 선언하면 된다.


java
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();
}
}
Test 2 실행 결과 2
Test 2 실행 결과 2

Q. 퀴즈풀이

1번

인원수를 입력받아 인원수만큼 과목별 점수를 입력하고 각 과목별 판정을 하시오
인원수 : 2
1번째 이름 : 전지현
국어? : 100
영어? : 100
수학? : 100

1번째 이름 : 옥주현
국어? : 80
영어? : 80
수학? : 80

 

java
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년 마무리..! 

 

반응형
블로그의 프로필 사진

블로그의 정보

무작정 개발

무작정 개발

활동하기