Developer Note/국비과정 수업내용 정리&저장

24년 09월 24일

DH_PARK 2024. 10. 3. 17:18

전역변수(global) : 다른 파일에서도 해당 변수에 접근이 가능하다

초기값을 지정하지 않으면 0으로 자동초기화된다.

지역변수(local) : 중괄호 내부에서 선언되어 함수 내부에서만 접근이 가능

정적변수(static) : 객체가 생성되기 이전부터 존재하는 변수

package C11;

import C00.C01System_out;

//다음 2개의 static 가진 ArrayUtils 클래스를 만들어보자. 다음 코드의 실행 결과를 참고하여 concat()와 print()를 작성하여 ArrayUtil 클래스를 완성하라.

class ArrayUtils {
	   public static int[] concat(int[] a, int[] b) {
	            /* 배열 a와 b를 연결한 새로운 배열 리턴 */
		   int[] arrList = new int[a.length + b.length];	//배열 arrList 생성(길이는 a,b 배열 길이 합친만큼)
		   System.arraycopy(a, 0, arrList, 0, a.length);		//arrList 배열에 a배열 복사
		   System.arraycopy(b, 0, arrList, a.length, b.length);		//arrList 배열에 b배열 복사하는데 복사 시작점은 a길이 만큼부터 해야 a배열 다음에 합쳐짐!
		   return arrList; 
	   }
	   	public static void print(int[] c) {
	   		for(int i=0;i<c.length;i++) {		//배열 c의 길이만큼 반복
	   			System.out.print(c[i]+" ");		// c를 출력하는데 공백을 추가
	   		}
	   			
	   		}
	   		
	   	
	   }
	   
	

public class C04Ex {
	public static void main(String[] args) {
		   // TODO Auto-generated method stub
			
	      int[] array1 = {1, 5, 7, 9};
	      int[] array2 = {3, 6, -1, 100, 77};
	      int[] array3 = ArrayUtils.concat(array1, array2);

	      ArrayUtils.print(array3);
	}
}

만약 배열의 길이를 선언했는데 배열안에 들어갈 요소가 그 배열의 개수보다 작다면 나머지 남은 배열 값은 기본인 0 으로 설정된다.

 

문제

홍길동이 gs남서편의점에서 콜라1개 구매

남길동이 gs남서편의점에서 콜라3개 구매

서길동이 gs동서 편의점에서 콜라10개 구매

package C12;

public class 길동 {
	int money;
	int colacnt;
	public 길동(int money, int colacnt) {
		super();
		this.money = money;
		this.colacnt = colacnt;
	}
	
	public void getCola(편의점 seller,int money) { //편의점 class 에 seller 객체 호출
		int colaCount=seller.sellCola(money); //다른 클래스의 seller.sellCola 메서드 사용해서 getCola의 money매개변수 받아서 사용
		this.colacnt += colaCount;
		this.money-=money;
	}
	
	}

	@Override
	public String toString() {
		return "길동 [money=" + money + ", colacnt=" + colacnt + "]";
	}
	
	
	
}
public class 편의점 {
	int colaCount;
	int colaPrice;
	int money;

	public 편의점(int colaCount, int colaPrice, int money) {
		super();
		this.colaCount = colaCount;
		this.colaPrice = colaPrice;
		this.money = money;
	}

	public int sellCola(int money) {
		int TakeColaCount=money/this.colaPrice;
		this.colaCount-=TakeColaCount;
		this.money +=money;

		return TakeColaCount;

	}

	@Override
	public String toString() {
		return "편의점 [colaCount=" + colaCount + ", colaPrice=" + colaPrice + ", money=" + money + "]";
	}
	

}

public class 메인 {

	public static void main(String[] args) {

		길동 홍길동 = new 길동(20000,0);
		길동 서길동 = new 길동(40000,13);

		편의점 GS감삼편의점 = new 편의점(1000,2000,500000);
		편의점 GS동서편의점 = new 편의점(500,3000,700000);

		홍길동.getCola(GS감삼편의점,6000);
		서길동.getCola(GS동서편의점, 10000);
		홍길동.getCola(GS동서편의점, 3000);

		System.out.println(홍길동);
		System.out.println(서길동);

		System.out.println(GS감삼편의점);
		System.out.println(GS동서편의점);
	}
}

상속 : 

클래스를 선언할 때 하위클래스에서 물려받은 상위클래스에서 소유한 기능과 변수를 그대로 사용하기 위해 extends 예약어를 통해 물려받는 것 (다형성)

상속 사용이유

  • 중복방지
  • 유지보수
  • 확장성

Super : 상속관계에 있는 상위클래스 상위 클래스의 생성자 호출

Employee(String name,int age,String addr){
		this.name = name;
		this.age = age;
		this.addr = addr;
	}
		Parttimer(String name,int age,String addr,int hour_pay){
		super(name,age,addr);
		this.hour_pay = hour_pay;
	} 

부모클래스에 있는 private 변수를 상속받아서 사용하려면 어떻게 해야 할까?

부모클래스에서 getter 와 setter 메서드를 정의하고 자식 클래스에서 이 메서드들을 통해 변수에 접근할 수 있다.

이렇게하면 캡슐화를 유지하면서도 상속관계에서 필요한 데이터에 접근할 수 있다.


상속 문제 풀이

class Employee{
	String name;
	private int age;
	private String addr; //private 변수 선언
	
		public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
		}//setter 와 getter 메소드 선언
		
class Parttimer extends Employee{ //자식class 생성
	int hour_pay;

	Parttimer(String name,int age,String addr,int hour_pay){
		super(name,age,addr);
		this.hour_pay = hour_pay;
	}
	public void showInfo() {
		System.out.printf("파트타이머 이름 : %s 나이 : %d 주소 : %s 시급 : %d",
		name,getAge(),getAddr(),hour_pay);
	} //getAge() 메서드를 통해 private 인 age 변수를 사용할 수 있게해준다.
	//값을 받아오는건 아님
	
			Regular 직원 = new Regular("박대해",22,"대구",500000); //객체 생성
		Parttimer 알바 = new Parttimer("아르바",55,"창녕",9900);
//		직원.setSalary(300000); //setter 로 직원salary 설정
		System.out.println(직원.salary);  직원 salary 출력
		System.out.println(직원.getAge()); 직원 age 출력(age가 private이기 때문에 getAge() 메서드로 받아서 사용)
		알바.showInfo(); 
		직원.showInfo();

여기서 객체가 생성 가능한 이유는 직원과 알바의 age 와 addr 이 super 예약어를 통해 생성자 자체가 호출되기 때문에 객체 생성이 가능한것이다. !!!

employee 클래스를 참조한 객체를 만들어도 출력은 안됨!

 

여기서 상위클래스에게서 상속을 받을 때 접근제어자가 private 라면 어떻게 될까?

super 예약어를 통해 상위클래스의 생성자를 불러와서 데이터 값을 초기화해준다.

그리고 초기화 후에 값을 설정해서 객체 생성은 가능하다. 여기서 , 왜냐?

super 예약어는 변수를 불러오는 예약어가 아니고 상위클래스의 생성자 자체를 불러오는 예약어이기 때문에 

생성자 자체가 private 가 아닌 이상 하위클래스에서도 상위클래스의 생성자를 사용해서 접근제어자가 private인 

변수도 초기화 할 수 있다.

그래서 하위클래스의 객체를 생성할 때 상위클래스 생성자를 호출해서 값을 초기화해준뒤에 

접근은 private 이기 때문에 getter 와 setter를 통해서 접근해서 사용하는 방식으로 동작한다. 

 

'Developer Note > 국비과정 수업내용 정리&저장' 카테고리의 다른 글

24년 09월 26일  (1) 2024.10.03
24년 09월 25일  (1) 2024.10.03
24년 09월 19일  (0) 2024.09.19
24년 09월 13일  (1) 2024.09.16
24년 09월 12일  (1) 2024.09.14