참조 자료형 변수
기본 자료형은 사용하는 메모리의 크기가 정해져있지만 , 참조 자료형은 클래스에 따라 다릅니다.
데이터 값을 그대로 저장하는 기본자료형과는 다르게 참조자료형은 메모리 상에서 데이터가 저장된 주소 , 즉 참조값을
저장하기에 참조 자료형이라고 불립니다.
다음은 참조 자료형의 구분입니다.
자료형 | 설명 |
class(클래스) | 오브젝트에 대한 설계를 담고있다. |
Array (Object[]) | 여러 같은 자료형의 데이터를 정적인 크기로 저장하는 자료구조를 제공합니다 |
annotation (@) | 특정 속성 정보를 프로그램 요소에 적용하기위한 방법을 제공합니다. |
interface | class의 일종이지만 , 일반적인 class와는 달리 메소드의 정의만을 담고있으며 , interface를 상속 받는 class에서 해당 메서드들을 구현합니다. |
enum | 특수한 형태의 class로 ,enum안에 있는 요소들은 해당 enum 타입의 인스턴스 이다. |
참조 자료형은 String을 제외하고는 미리 정의 되어있지 않습니다.
원본 데이터의 주소(참조값)만 가지고있기에 모든 참조 자료형의 크기는 같다. (JVM에서는 8바이트 할당)
null값도 할당가능하며
예시) Example E1; 입니다.
기본자료형은
자바언어 자체에 미리 정의 되어있습니다.
자료형의 종류에 따라 크기가 달라지며 NULL값 할당 불가능하고
예시) int num =199; 입니다.
접근 제어 지시자(access modifier)와 정보은닉(information hiding)
클래스 외부에서 클래스의 멤버 변수, 메서드 , 생성자를 사용할수있는지 여부를 지정하는 키워드
private 는 같은 클래스 내부에서만 접근이 가능하며 외부에서는 접근이 불가합니다.
protected 는 같은 패키지나 삭속관계의 클래스에서 접근 가능하고 그 외 외부에서는 접근할수 없음.
public 은 클래스 내외부 어디서나 접근가능합니다.
get()/set() 메서드
private으로 선언된 멤버변수(필드)에 대해 접근, 수정할 수있는 메서드를 public으로 제공한다.
package ch_exam3;
public class CarTest {
public static void main(String[] args) {
Car carObject;
carObject = new Car();
carObject.set(15);
System.out.println(carObject.get());
carObject.set(8);
System.out.println(carObject.get());
}
}
package ch_exam3;
public class Car {
private int fuel =0;
void set(int input1){
if( input1 <10){
System.out.println("input1 값이 10보다 적다");
}
else {
fuel = input1;
}
}
int get(){
return fuel;
}
}
위 코드는 get() set()의 기본 예제 입니다. 객체 를 생성하고 값을 받고 주고하는것입니다.
클래스 내에 SET, GET 메소드를 선언합니다.
SET 은 변수값을 할당하는 목적의 함수이기 때문에 인자를 받아야 하고
GET 은 변수값을 반환하는 목적이기 때문에 return 이 필요합니다.
정보 은닉
private으로 제어한 멤버 변수도 public 메서드가 제공되면 접근 가능하지만 변수가 public으로 공개되었을때보다
private 일때 각 변수에 대한 제한을 public 메서드에서 제어할수있다.
객체 지향 프로그램에서 정보 은닉은 필요한 외부에서 접근 가능한 최소한의 정보를 오픈함으로써 객체의 오류를 방지하 클라이언트 객체가 더 효율적으로 객체를 활용할 수 있도록 해줍니다.
인스턴스 변수의 직접적인 접근을 허용하면, 컴파일 과정에서 드러나지 않는 중대한 실수가 발생할 수 있다.
접근을 허용하지 않도록 클래스를 설계할 필요가 있고, 이러한 클래스의 설계를 가리켜 정보 은닉 이라고 한다.
package hiding;
public class MyDate {
int day;
int month;
int year;
}
package hiding;
public class MyDateTest {
public static void main(String[] args) {
MyDate date = new MyDate();
date.day = 10;
date.month = 7;
date.year = 2020;
}
}
위 와같이 코드를 짜면
public class MyDateTest {
public static void main(String[] args) {
MyDate date = new MyDate();
date.day = 100;
date.month = 70;
date.year = 20200;
}
}
다음과 같이 잘못된 값을 입력했을때 의도치않은 결과값이 나올수가있기떄문에
public class MyDate {
private int day;
private int month;
private int year;
//1번
private boolean isValid;
public void setDay(int day) {
this.day = day;
}
public int getMonth() {
return month;
}
//2번
public void setMonth(int month) {
if (month > 12 || month < 1) {
isValid = false;
} else {
this.month = month; }
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getDay() {
return day;
}
//3번
public void showDate() {
if (isValid) {
System.out.println(year + "년" + month + "월" + day + "일 입니다.");
} else {
System.out.println("유효하지 않은 날짜 입니다.");
}
}
}
사용자가 입력하는 값의 범위를 지정하기 위해 2번과 같이 set~메서드 안에 조건문을 통해 특정 범위의 값만 입력되고 그렇지 않을 경우 다른 수행문을 수행 하도록 지정할 수 있습니다.
위의 코드의 경우 1번과 같이 boolean 변수를 지정 후 2번에서 입력 값의 범위를 넘어설 경우 false를 입력하게 되게하여 3번 출력문에서 false일경우 "유효하지 않은 날짜 입니다"라는 메세지를 출력할 수 있게 작성되었습니다.
참고로 입력값을 받지 않고 클래스에서 입력되어 있는 값을 읽기만 하는 경우라면 set메서드를 작성하지않고 get메서드만 작성하면 됩니다.
정리해 보면 위와 같이 프로그래머가 사용자가 멤버 변수에 대해 조건적인 접근이 필요하다고 판단 하는 경우 변수에 private이라는 접근제어자를 사용하여 정보를 은닉하고 public메서드가 지정한 방식으로만 변수에 접근 할 수 있게 해야 합니다.
객체간의 협력
객체 지향 프로그램에서는 객체간의 협력으로 이루어집니다.
협력을 위해서는 필요한 메세지를 전송하고 이를 처리하는 기능이 구현 되어야합니다.
James와 Tomas는 각각 버스와 지하철을 타고 학교에 갑니다.
James는 5000원을 가지고 있었고, 100번 버스를 타면서 1000원을 지불합니다.
Tomas는 10000원을 가지고 있었고, 초록색 지하철을 타면서 1200원을 지불합니다.
두 학생이 버스와 지하철을 타는 상황을 구현해 봅시다.
public class Student {
String studentName;
int grade;
int money;
public Student(String studentName, int money) {
this.studentName = studentName;
this.money = money;
}
public void takeBus(Bus bus) {
bus.take(1000);
this.money -= 1000;
}
public void takeSubway(Subway subway) {
subway.take(1200);
this.money -= 1200;
}
public void showInfo() {
System.out.println(studentName +"님의 남은 돈은 " + money + "원 입니다");
}
}
public class Bus {
int busNumber;
int passengerCount;
int money;
public Bus(int busNumber) {
this.busNumber = busNumber;
}
public void take(int money) { //승차
this.money += money;
passengerCount++;
}
public void showBusInfo() {
System.out.println(busNumber + "번 버스의 승객은 " + passengerCount + "명 이고, 수입은 " + money + "원 입니다");
}
}
public class Subway {
int lineNumber;
int passengerCount;
int money;
public Subway(int lineNumber) {
this.lineNumber = lineNumber;
}
public void take(int money) {
this.money += money;
passengerCount++;
}
public void showSubwayInfo() {
System.out.println(lineNumber + "번 지하철의 승객은 " + passengerCount + "명 이고, 수입은 " + money + "원 입니다");
}
}
public class TakeTransTest {
public static void main(String[] args) {
Student studentJ = new Student("James", 5000);
Student studentT = new Student("Tomas", 10000);
Bus bus100 = new Bus(100);
Subway subwayGreen = new Subway(2);
studentJ.takeBus(bus100);
studentT.takeSubway(subwayGreen);
studentJ.showInfo();
studentT.showInfo();
bus100.showBusInfo();
subwayGreen.showSubwayInfo();
}
}
다음 객체간의 협력코드의 예제입니다. 기본중의 기본이니 이코드를 기반으로 많은 복습이 필요합니다.
여러 인스턴스에서 공통으로 사용하는 변수를 사용하자
-static 변수
공통으로 사용하는변수가 필요한이유는 여러가지가있습니다. 값을 공유하는 인스턴스가 기준의 값이 필요하거나
학생마다 새로운 학번생성,카드회사 카드 번호등 여러가지가있습니다.
프로그램을 구동시키면 메모리에 올라가게된다. 이런현상이 프로세스 현상이라고하며,
이때 메모리의 올라가게될때 1. 코드 영역 2.데이터 영역(상수 ,스테틱 영역)이있다.
코드에서 인스트럭션 셋이 수행이되며 라인 바이 라인 으로 수행이된다. 데이터영역은 처음부터 데이터를잡는것이다.
예를 들어 상수나 ,리터럴값 , 스테틱변수값 등 데이터영역으로 들어간다.
인스턴스가 생성될떄마다 사라지면없어지는것이 힙메모리이다.
public class Employee {
public static int serialNum = 1000;
private int employeeId;
private String employeeName;
private String department;
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
public class EmployeeTest {
public static void main(String[] args) {
Employee employeeLee = new Employee();
employeeLee.setEmployeeName("이순신");
System.out.println(employeeLee.serialNum);
Employee employeeKim = new Employee();
employeeKim.setEmployeeName("김유신");
employeeKim.serialNum++;
System.out.println(employeeLee.serialNum);
System.out.println(employeeKim.serialNum);
}
}
싱글톤 패턴이란?
프로그램에서 인스턴스가 단한 개만 생성되어야하는 경우 사용하는 디자인 패턴입니다.
static 변수 , 메서드를 활용하여 구현할수있습니다.
예를들어 날짜같은것들은 여러개를 가질수가없습니다. 그렇기때문에 그 인스턴스는 여러개일수가없습니다.
싱글톤패턴으로 회사 객체 구현해보겠습니다.
'자바 정리' 카테고리의 다른 글
자바 인강4주차 (0) | 2022.08.28 |
---|---|
자바 인강 3주차(2) (0) | 2022.08.24 |
자바 인강2주차 객체지향 (0) | 2022.08.16 |
자바 2주차. (0) | 2022.08.07 |
자바 인강 1주차. (0) | 2022.08.04 |