전역변수(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 |