무작정 개발.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

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. 부모와 자식이 같은 객체를 가지고 있으면 무조건 자식(내 거)을 쓴다.
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. 부모꺼는 내꺼다
	}

}

Test 2 실행 결과
Test 2 실행 결과

상속을 할 때 '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();
	}

}

Test 2 실행 결과 2
Test 2 실행 결과 2


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

 

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기