객체 간 협력
예제)
package test6_2;
//학생 클래스 구현
public class Student {
public String studentName; //학생 이름
public int money; //학생이 가진 돈
//학생 이름과 학생이 가진 돈을 매개변수로 받는 생성자
public Student(String studentName, int money) {
this.studentName = studentName;
this.money = money;
}
//학생이 버스를 타면 1000원을 지불하는 기능을 구현한 매서드
public void takeBus(Bus bus) {
bus.take(1000);
this.money -= 1000;
}
//학생이 지하철을 타면 1500원 지불하는 기능을 구현한 메서드
public void takeSubway(Subway subway) {
subway.take(1500);
this.money -= 1500;
}
//학생의 현재 정보를 출력하는 메서드
public void showS() {
System.out.println(studentName + " 남은 돈은 " + money);
}
}
package test6_2;
//버스 클래스 구현
public class Bus {
int busNum; //버스 번호
int money; //버스 수입
//버스 번호를 매개변수로 받는 생성자
public Bus(int busNum) {
this.busNum = busNum;
}
//승객이 버스를 탄 경우를 구현한 메서드
public void take(int money) {
this.money += money;
}
//버스 정보를 출력하는 메서드
public void showB() {
System.out.println(busNum + " 수익 " + money);
}
}
package test6_2;
//지하철 클래스 구현
public class Subway {
String subLine; //지하철 노선
int money; //지하철 수익
//지하철 노선을 매개변수로 받는 메서드
public Subway(String subLine) {
this.subLine = subLine;
}
//승객이 지하철을 탄 경우를 구현한 메서드
public void take(int money) {
this.money += money;
}
//지하철 정보를 출력하는 메서드
public void showSub() {
System.out.println(subLine + " 수익 " + money);
}
}
package test6_2;
public class TakeTrans {
public static void main(String[] args) {
Student student1 = new Student("학생1", 100000); //학생 1 생성
Student student2 = new Student("학생2", 1000000); //학생 2 생성
Bus bus = new Bus(1); //버스 번호가 1인 버스 생성
student1.takeBus(bus); //student1이 1번 버스를 탐
student1.showS(); //학생 1 정보 출력
bus.showB(); //버스 정보 출력
Subway subway = new Subway("1호선"); //지하철 1호선인 지하철 생성
student2.takeSubway(subway); //student2가 1호선 지하철을 탐
student2.showS(); //학생 2 정보 출력
subway.showSub(); //지하철 정보 출력
}
}
static 변수
static 자료형 변수명
ex) static int serialNum;
'정적 변수'라고도 함.
모든 인스턴스가 공통된 값을 공유하는 변수.
프로그램이 실행되어 처음 메모리에 로딩될 때 딱 한 번 생성되고 프로그램의 수행이 끝 날 때까지 존재.
인스턴스를 생성하지 않아도 사용 가능.
변수 선언부 앞에 static 키워드를 붙여줌.
클래스 변수(static variable)의 용도
인스턴스에 따라서 변하지 않는 값이 필요한 경우
인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우
값의 변경 사항을 모든 인스턴스가 공유해야하는 경우
인스턴스 변수
객체마다 가지는 고유한 변수
인스턴스를 생성할 때 만들어짐
인스턴스마다 고유의 저장 공간을 가지므로 각각의 다른 값을 가질 수 있음
다량의 인스턴스를 생성할 때 인스턴스마다 특별한 값을 가져야할 경우 선언
변수 선언부 맨 앞에 static 키워드를 붙여주지 않음
package test6_3;
public class Student {
public int studentID; //인스턴스 변수
public String studentName; //인스턴스 변수
public static int grade = 3; //정적변수, static변수, 클래스 변수
public String address; //인스턴스 변수
public void show() {
System.out.println("학번 : " + studentID);
System.out.println("이름 : " + studentName);
System.out.println("학년 : " + grade);
System.out.println("주소 : " + address);
}
}
package test6_3;
public class StudentMain {
public static void main(String[] args) {
//클래스 변수(static variable)
//객체를 생성하지 않고도 사용이 가능
//접근방법 : 클래스명.변수명
System.out.println(Student.grade);
}
}
package test6_3;
public class StudentMain {
public static void main(String[] args) {
//클래스 변수(static variable)
//객체를 생성하지 않고도 사용이 가능
//접근방법 : 클래스명.변수명
System.out.println("클래스 변수 출력 : " + Student.grade);
System.out.println("------------------");
Student st = new Student(); //기본 생성자
st.show();
}
}
package test6_3;
public class StudentMain {
public static void main(String[] args) {
//클래스 변수(static variable)
//객체를 생성하지 않고도 사용이 가능
//접근방법 : 클래스명.변수명
System.out.println("클래스 변수 출력 : " + Student.grade);
System.out.println("------------------");
Student st = new Student(); //기본 생성자
st.show();
System.out.println("------------------");
st.studentName = "자바";
System.out.println(st.grade);
st.show();
}
}
package test6_3;
public class StudentMain {
public static void main(String[] args) {
//클래스 변수(static variable)
//객체를 생성하지 않고도 사용이 가능
//접근방법 : 클래스명.변수명
System.out.println("클래스 변수 출력 : " + Student.grade);
System.out.println("------------------");
Student st = new Student(); //기본 생성자
st.show();
System.out.println("------------------");
st.studentName = "자바";
System.out.println(st.grade);
st.show();
System.out.println("------------------");
Student st1 = new Student(); //두 번째 객체 생성
st1.studentName = "자바스크립트";
System.out.println(st1.grade);
st1.show();
System.out.println("------------------");
}
}
즉 클래스 변수는 대량 생산의 목적을 위해 사용함.
package staticex;
//static 변수 사용하기
public class Student {
public static int serialNum = 1000; //static 변수는 인스턴스 생성과 상관없이 먼저 생성됨
public int studentID;
public String studentName;
public int grade;
public String address;
public String getStudentName() {
return studentName;
}
public void setStudentName(String name) {
studentName = name;
}
}
package staticex;
//static 변수 테스트하기
public class StudentTest1 {
public static void main(String[] args) {
Student s1 = new Student();
s1.setStudentName("이지원");
System.out.println(s1.serialNum); //serialNum 변수의 초깃값 출력
s1.serialNum++;
Student s2 = new Student();
s2.setStudentName("손수경");
System.out.println(s2.serialNum);
System.out.println(s1.serialNum);
}
}
package staticex;
//학번 자동으로 부여하기
public class Student1 {
public static int serialNum = 1000;
public int studentID;
public String studentName;
public int grade;
public String address;
//생성자
public Student1() {
serialNum++; //학생이 생성될 때마다 증가
studentID = serialNum;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String name) {
this.studentName = name;
}
}
package staticex;
//학번 확인하기
public class StudentTest2 {
public static void main(String[] args) {
Student1 s1 = new Student1();
s1.setStudentName("이지원");
System.out.println(s1.serialNum);
System.out.println(s1.studentName + " 학번 : " + s1.serialNum);
Student1 s2 = new Student1();
s2.setStudentName("손수경");
System.out.println(s2.serialNum);
System.out.println(s2.studentName +" 학번 : " + s2.serialNum);
Student1 s3 = new Student1();
s3.setStudentName("류유경");
System.out.println(s3.serialNum);
System.out.println(s3.studentName +" 학번 : "+ s3.serialNum);
}
}
package staticex;
//클래스 이름으로 static 변수 참조하기
public class StudentTest3 {
public static void main(String[] args) {
Student1 s1 = new Student1();
s1.setStudentName("설아름");
System.out.println(Student1.serialNum);
System.out.println(s1.studentName +" 학번 : " + Student1.serialNum);
Student1 s2 = new Student1();
s2.setStudentName("정인식");
System.out.println(Student1.serialNum);
System.out.println(s2.studentName +" 학번 : " + Student1.serialNum);
//System.out.println(Student1.serialNum); serialNum 변수를 직접 클래스 이름으로 참조
}
}
package staticex;
//serialNum의 get(), set() 메서드 사용하기
public class Student2 {
private static int serialNum = 1000; //public에서 private로 변경
public int studentID;
public String studentName;
public int grade;
public String address;
//생성자
public Student2() {
serialNum++; //학생이 생성될 때마다 증가
studentID = serialNum;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String name) {
this.studentName = name;
}
public static int getSerialNum() {
return serialNum;
}
public static void setSerialNum(int serialNum) {
Student2.serialNum = serialNum;
}
}
package staticex;
//학번 출력하기
public class StudentTest4 {
public static void main(String[] args) {
Student2 s1 = new Student2();
s1.setStudentName("이지원");
System.out.println(Student2.getSerialNum());
System.out.println(s1.studentName +" 학번 : " + s1.studentID);
Student2 s2 = new Student2();
s2.setStudentName("손수경");
System.out.println(Student2.getSerialNum());
System.out.println(s2.studentName +" 학번 : " + s2.studentID);
}
}
'KDT > Java' 카테고리의 다른 글
231213 Java (0) | 2023.12.13 |
---|---|
231211 Java (0) | 2023.12.11 |
231206 Java (0) | 2023.12.06 |
231204 Java (0) | 2023.12.04 |
231130 Java (0) | 2023.11.30 |