본문 바로가기

JAVA

JAVA(16) - 객체(object) /객체지향/객체 지향의 4대 특성/Class/Class 실습/필드의 초기화/메소드/변수의 종류/클래스맴버/인스턴스맴버/패키지

1. 객체(object) 

 

객체, 클래스, 인스턴스 상태와 기능을 가지고 있는 고유 단위 = 객체(object)

자바에서 객체를 만들기 위한 설계도/틀 = class

class로 만든 (new) 객체 = 인스턴스(instance)

 

2.객체 지향의 4대 특성

1. 캡슐화(정보은닉)
   상태 + 기능 = 객체
   변수 + 메소드 = class

 

  • 필드(변수)의 종류
    • 고유값(변경되지 않는 값)
    • 가변값(변경되는 값) 
  • 가변값을 처리하는 기능을 제공 -> 메소드

 

예제) TV, 의자, 책을 객체로 만들자 - > class로 만들자.

 

1.) TV
상태, 데이터 - on/off 상태, 체널, 볼륨 조절, 크기
상태(state)는 데이터를 저장하는 필드(field)라고 함.
필드는 고유값을 저장하는 필드와 기능 처리 시 필요한 가변값을 저장하는 필드가 있음.

class Tv {//앞에 접근제한이 생락되어있을 경우 default가 생략된것!
	//가변 필드 변수
	boolean power;	//데이터형을 뭐로 지정하던 상관없고(정수형이나 다른 자료형으로 변수 만들어줘도 됨) 이런 상태를 저장할 수 있는 변수를 선언해주는 것이 중요!
	int channel; 
	int volumn;
	//고유 필드 변수
	int size;
	String maker;
	
	public void onOff() {
		//Tv의 power를 변경할 수 잇는 방법을 제공
//		if(power == true) {
//			power = false;
//		}
//		else {
//			power = true;
//		}
		
		power = !power;	//위의 if문을 한줄로 간단하게 표현할 수 있음.
	}
	
	//번호를 받아서 채널 변경
	public void channelChange(int num) {
		channel = num;
		System.out.println("채널 변경 : " + channel);
	}
	
	//볼륨 변경. 한번 누르면 1씩 증감.
	public void volumnUp() {
		volumn++;
		System.out.println("볼륨 : " + volumn);
	}
	public void volumnDown() {
		volumn--;
		System.out.println("볼륨 : " + volumn);
	}
}

Tv처럼 에어컨, 의자, 책 class를 정의해 보자.

class Aircon{
	//가변 필드
	boolean power;
	int windpower;
	int winddirection;
	int now_temperature, set_temperature;
	//고유 필드
	String maker;
	int size;
}

class Chair{
	int lheight, lwidth, lvertical;
	int bheight, bwidth, bvertical;
	int mheight, mwidth, mvertical;
	int wheel,rwheel;
	String meterial;
}

class Book{
	//고유 필드
	String title;
	String text;
	String genre;//장르
	String author;
	String publisher;
	String ISBN; //책 고유번호
	//가변 필드
	int chapter;
	int price;
}

 

2.)객체의 종류
1. 완성품에 해당하는 객체 = 프로그램
2. 부품에 해당하는 객체
3. 정보를 저장하는 객체

NEXT) 사람의 class를 정의해 보자.
연락처 프로그램의 정보 처리용
Data Transfer Object(DTO)

class PersonInfo{
	//고유필드
	String name;
	String phoneNum;
	String birth;
	String gender;
	String address;
	int age;
	
}

3.) 정보은닉을 위한 장치 접근제어자

  • 접근 제어자 종류(public, default, protected, private)
    • public - 접근 제한 없음. (주로 메소드 앞에 붙여줌)
    • default -  같은 패기지에서는 제한 없음,
    • protected - 상속을 받을 경우 다른 패키지에서 접근 가능
    • private - 접근 불가. (주로 변수 앞에 붙여줌)
  • 기타 제어자(접근 제어자가 아닌 제어자)
    • final
    • abstract (추상화) 

4.) 변수를 접근제어하고 메소드를 사용하면 좋은 점
      

  • 접근 제어 겸 부가 기능을 제공할수 있음
         
  •  필터 기능
     ex) 자동차에서 가속할 경우 제한 속도 이상으로 속도가 증가되는 것을 막을 수 있다.

3. Class 실습 

 

1.) 인스턴스 만들기

Tv myTv = new Tv();

2.) Tv 켜기 - power 값 변경

		myTv.power = true;
		myTv.power = false;
		myTv.size = 80;
		
		Tv yourTv = new Tv();
		yourTv.power = true;
		yourTv.channel = 11;
		yourTv.volumn = 15;

3.) 인스턴스의 메소드 사용방법 예시

		myTv.onOff();
		myTv.channelChange(3);
		myTv.volumnUp();
		myTv.volumnUp();
		myTv.volumnUp();
		myTv.volumnDown();

4.) 한사람 정보 저장용 인스턴스

		PersonInfo p1 = new PersonInfo();
		p1.name = "홍길동";
		p1.age = 26;
		p1.phoneNum = "010-1234-5678";
		p1.birth = "2000-03-16";
		p1.gender = "남";
	    p1.address= "인천시 미추홀구";

5.) 2번째 사람 정보 - 나머지 배열에는 null값이 들어가게 됨.

	    person[0].name = "아무개";
	    person[0].phoneNum = "010-9999-9999";
	    person[0].address = null; // '\0' : 0에 해당하는 값으로 초기화 가능

6.) 10명의 정보를 저장하는 인스턴스 배열

	    PersonInfo person[] = new PersonInfo[10];
	    person[0].name = "전우치";
	    person[0].age = 25;
	    person[0].phoneNum = "010-9876-5432";
	    person[0].birth = "2001-05-15";
	    person[0].gender = "남";
	    person[0].address = "인천시 부평구";

 

4. 필드의 초기화 

1.) 선언과 함께 초기화
   private int age = 1;

2.) 메소드를 이용한 초기화 : Setter / Getter
   : 이 중에 Setter 메소드를 활용하여 초기화.
   * Setter /Getter 자동생성 방법) 팝업메뉴 source > Generate Getters and Setters..

package com;

public class CarClass {
	private int speed;//속도값
	private String model; //모델명
	private String company; // 제조사
	private int door;// 문짝수

	//모든 변수 (필드)를 위한 setter/getter 메소드 작성
	// 규칙 아닌 규칙
	// 1.public 제어자 사용
	// 2.이름을 지을 때 앞에 set으로.
	//3. 변수 이름의 첫글자를 대문자로 하여 set/get 뒤에 붙임.
	public void setSpeed(int s) { //집어넣는다 (setter)
		speed = s;
	}
	public int getSpeed() {//꺼내온다.(getter)
		return speed;
	}

	public void speedUp(int s) {
		speed = s;
		if(speed>200) {
			speed=200;
		}
	}
	
	//getter/setter 자동생성
	//this : 인스턴스의 주소를 저장하고, 필드내의 변수임을 명확하게 명시하기 위해 붙여줌
	public String getModel() {
		return model;
	}
	public void setModel(String model) {
		this.model = model;
	}
	public String getCompany() {
		return company;
	}
	public void setCompany(String company) {
		this.company = company;
	}
	public int getDoor() {
		return door;
	}
	public void setDoor(int door) {
		this.door = door;
	}


}

 

  • this 란?
    인스턴스 자신의 주소를 저장하는 내부 필드
    인스턴스 생성시 자동으로 만들어져서 주소를 저장함
    여러 인스턴스가 존재할 경우 각 인스턴스의 필드를 구별하기 위해 사용
    -> 매개변수와 필드(맴버)변수의 구분을 위해서 사용

5. 메소드

  - 작업을 수행하기 위한 명령문의 집합
  - 어떤 값을 입력받아서 처리하고 그 결과를 돌려준다. 
  (입력받는 값이 없을 수도 있고 결과를 돌려주지 않을 수도 있다.)

6. 메소드의 장점

  • 반복적인 코드를 줄이고 코드의 관리가 용이하다.
  • 반복적으로 수행되는 여러 문장을 메소드로 작성한다.
  • 하나의 메소드는 한 가지 기능만 수행하도록 작성하는 것이 좋다.
  • 관련된 여러 문장을 메소드로 작성한다.

 

7. 메소드 정의 방법

메소드는 클래스 영역에만 정의할 수 있음. (메소드 내부에 메소드를 정의할 수 없음) 

  접근제어자 리턴타입 메소드명(매개변수 목록) 
  { 
     기능 처리용 명령문들.. 
     [return 변수/값/연산식;] 
  } 

1.) 반환형 
    메소드 마지막에 반환을 처리하는 return 문장이 있을 경우, 반환하는 값에 따라 결정. 
    반환이 없을 경우 void를 사용. 

2.) 메소드의 유형 
  1. 입력(매개변수)과 반환(return)이 있는 경우 
  2. 입력만 있는 경우 
  3. 반환만 있는 경우 
  4. 둘다 없는 경우 

 

3.) 사용 방법 
  다른 메소드에서 호출하여 사용 
  반환값이 있을 경우 반환값을 받기위한 변수를 사용. 
  int res = add(1, 2); 
  1과 2를 더한 결과가 반환되어 res에 대입됨. 

  반환값이 없을 경우 메소드이름(매개값)만 작성. 
  setSpeed(10); 
  10이 메소드에 들어감. 내부적 처리는 모름.. 

8. 변수의 종류(맴버란?) 

클래스 내부에 존재하는 변수, 메소드를 멤버라고 함. 
크게 2가지로 구분 
1. 맴버변수 
클래스 내부의, 메소드 밖에 있는 변수 
클래스 내부에서만 사용되는(존재하는) 변수 
인스턴스 멤버변수, 클래스(static) 멤버변수 

1.)멤버의 종류 
1-1.) 클래스 멤버(static 멤버) 
변수나 메소드 앞에 static 키워드가 붙는 멤버 
인스턴스를 생성하지 않아도(new를 사용하지 않아도) 사용할 수 있는 멤버. 

 

  • 다른 클래스에서 사용할 경우 
    클래스이름.변수 = 값; 
    클래스이름.메소드(); 

 

  • 같은 클래스에서 사용할 경우 
    변수 = 값; 
    메소드(); 

 

1-2.) 인스턴스 멤버 

변수나 메소드 앞에 static 키워드가 붙지 않는 멤버 
인스턴스를 생성해야(new를 사용하여) 사용할 수 있는 멤버 

  • 다른 클래스에서 사용할 경우 
        인스턴스이름.변수 = 값; 
        인스턴스이름.메소드(); 
  • 같은 클래스에서 사용할 경우 
        변수 = 값; 
        메소드();

2. 지역변수 
일반 지역변수 
매개변수 
: 메소드 호출 시에만 생성되었다가 메소드 종료 시 제거. 

	public int add(int a, int b) {
		int result = a + b;
		return result;
	}
	//매개변수로 배열 사용
	public int add2(int a[]) {
		int result = a[0] + a[1];
		return result;
	}
	

 

9. 패키지

패키지란 자바파일을 묶어주는 폴더 역할

 

아래 예시처럼 그랜져를 입력할 때 myCar는 다른 패키지에 있어서 에러 발생함.

package user;

import com.*;

public class MainClass {

	public static void main(String[] args) {
		CarClass myCar = new CarClass();
//		myCar.modelName = "그랜져";  //다른 패키지에 존재해서 에러남
		
//		패키지는 자바파일을 묶어주는 폴더 역할
		Dealer d1 = new Dealer();
	}

}