DAY+9 클래스,객체,메소드

2020. 9. 1. 17:08Web_Back-end/JAVA_선행

◎ 객체지향 프로그래밍

  • 다양한 기능을 하는 소프트웨어 객체들이 존재하고 이러한 객체들을 조합하여 원하는 기능을 구현하는 기법
  • ex) 조립컴퓨터 : 각 컴퓨터 하드웨어 부품을 구입하여 조립한 것이 컴퓨터가 된다

 

◎  객체

  • 객체 (Object) : 객체 지향 기술의 핵심 개념
  • 객체는 상태동작을 가지고 있다
  • 객체의 상태는 객체의 속성이다
  • 객체의 동작은 객체의 기능이다
  • ex: 텔레비전의 경우 / 상태 : 채널번호,볼륨,전원상태 등 // 동작 : 켜기,끄기,채널&볼륨 변경 등
  • 객체의 상태 & 동작 ----s/w---> 필드 & 메소드
  • 필드 : 객체안의 변수(객체의 상태저장)
  • 메소드 : 객체의 동작(특정한 작업수행)
  • 객체 = 필드 + 메소드

 

객체 ( Object )
상태 동작
객체의 속성
ex) 채널번호, 볼륨, 전원상태
객체의 기능
ex) 채널,볼륨 변경, 켜기,끄기
필드 메소드
객체안의 변수
(상태저장)
객체의 동작
(작업수행)
따라서 객체 = 필드 + 메소드

 

◎ 객체지향 프로그래밍 특징

① 캡슐화

  • 캡슐화 : 코드의 재사용을 위해 데이터의 알고리즘을 하나의 묶음으로 정리하는 것
  • 하나의 캡슐 = 객체
  • 객체의 필드 <---매칭---> 데이터
  • 객체의 메소드 <---매칭---> 알고리즘
  • 캡슐화의 목적
    1. 응집력 ↑높이고, 결합도 낮춘다↓
    2. 정보은닉 : 객체의 유지보수를 위해 내부데이터를 보호해야함 
    3. 따라서, 객체에 접근하려면 공개된 메소드를 이용하여 접근한다.

 

② 상속성

  • 상속성 : 코드의 재사용을 위해 이미 작성된 클래스(부모)를 이어받아 새로운 클래스(자식)를 생성하는 기법
  • 자식 클래스는 부모 클래스의 속성과 동작을 모두 물려받는다
  • 자식 클래스만 필요한 기능을 추가 또는 변경하여 사용할 수 있다

 

③ 다형성

  • 다형성 : 객체가 취하는 동작이 상황에 따라서 달라지는 것을 의미
  • 서로 다른 타입에 속하는 객체들이 같은 이름의 멤버함수에 응답하여서 서로 다른 동작을 보여준다
  • ex) speak -> 개 -> 멍멍 // speak -> 고양이 -> 야옹

 

④ 추상화

  • 추상화 : 불필요한 정보는 숨기고 중요한 정보만을 표현하는 기법
  • ex) TV를 객체로 나타내는 작업
    • TV에 축척된 모든 기술 나타내기 -> 너무 복잡
    • 따라서, 불필요한 것 삭제, 전원&채널&볼륨 기능만 있다고 가정
    • -->>> 추상화는 개발자마다 달라진다 (개발자마다 객체에 대해 관심사가 다르기 때문)

 

◎ 클래스

  • 클래스 
    • 객체의 형태를 정의하는 (ex:와플기계)
    • 객체 지향에서 소프트웨어의 기본 단위
  • 클래스 사용이유
    • 같은 종류의 객체가 많이 필요하기 때문

 

◎ 클래스의 구조

  • 클래스는 데이터와 코드를 동시에 가지고 있다 (객체를 정의하는 틀이기 때문)
  • 클래스 안에는 필드와 메소드들이 정의됨 -> 클래스의 멤버
  • 필드는 객체안에서 정의된 변수 ( 자료형 + 변수이름 ) 로 선언

 

◎ main 클래스란

  • D+1~D+8 사용해온 class는 main() 메소드만 가지고 있었음
  • 일반적인 클래스 -> main()을 가질 필요 없음
  • 특정한 클래스가 프로그램의 시작점이 되는 경우main() 메소드를 사용

 

EX) BICYCLE Bicycle class name
name fields (states)
weight
price
+move() methods (behaviors)
+horn()

 

◎ Java의 명명규칙

  1. 클래스 이름 (ex: Television)
    • 문자로 시작
  2. 메소드 이름 (addNums)
    • 소문자로 시작 + 낙타체
  3. 상수이름 (PIE, PIE_OF_NUMS)
    • 모든 글자 대문자
    • 여러글자 언더바(_)로 구분

 

< 예제 1 클래스를 정의하는 방법 > 

① Television class 생성 ② 3개의 필드 선언 (channel, volume, onOff)

//class Television
public class Television {
	
	int channel;
	int volume;
	boolean onOff;
    
}

▶ 새로운 클래스를 정의하는 것은 프로그램에서 사용할 수 있는 새로운 자료형을 하나 추가하는 것과 같다

 컴파일러는 Telebision 클래스도 하나의 자료형 (int와 같은) 으로 간주한다

 

< 예제 2 객체 생성 실습 > 

① 예제 1번의 Television 클래스를 테스트하기위해 새로운 클래스 TelevisionTest 생성 

② main() 함수를 통해 접근하기

public class TelevisionTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Television tv = new Television();
		tv.channel = 1;
		tv.volume = 10;
		tv.onOff = false;
		System.out.println("텔레비전의 채널은: " + tv.channel + "이고, 볼륨은: " + tv.volume + "입니다.");
		if(tv.onOff) {
			System.out.println("tv가 켜져있습니다.");
		}
		else {
			System.out.println("tv가 꺼져있습니다.");
		}
	}   
}    

▽ console

더보기
예제 2 콘솔창

▶ Java에서 모든 문장은 클래스안에 들어가야 한다

▶ 객체 멤버 접근하기

  • 객체의 필드나 메소드에 접근하려면 참조변수에 멤버연산자(.) 필요
  • 최근에 필드대신 인스턴스 변수라는 용어도 사용

 


 

◎ new 연산자

Television tv = new Television();

==

Television tv

tv = new Television();

tv -> 참조변수 (선언) // new Television(); -> 객체 생성

 

◎ 하나의 클래스에 여러개의 객체 생성

Television tv = new Television();
	tv.channel = 3;

Television myTv = new Television();
	myTv.channel = 7;

▲ 두 객체간 데이터는 완전히 분리되어 있다 = 참조 변수이기 때문

 

◎ 참조변수와 대입연산

※ 참조변수를 복사하면 참조값(주소)가 복사되어 동일한 객체를 참조하게 된다

// tv1을 통해 객체 필드 값을 변경하면 tv2의 필드 값도 변경됨
Television tv1 = new Television();
Television tv2 = tv1;


//이때는 tv2가 tv3의 객체를 가르킴 -> 순서대로 읽기 때문
Television tv1 = new Television();
Television tv2 = tv1;
Television tv3 = new Television();
Television tv2 = tv3;

 

◎ java 메모리 관리 - garbage collection

  • new 연산자에 의해 히프 메모리(heap memory)에 할당된다
  • 메모리는 무한하지 않으므로 사용하지 않는 객체는 삭제하여 메모리를 확보해야 한다
  • 자바는 자동 메모리 수거 시스템을 사용한다---> garbage collection( gc, 쓰레기 수집)
  • 객체에 대한 참조가 없다면 삭제시킨다
    • Television myTv = new Television();
    • myTv = null;
    • --> 참조변수에 null이 대입되었기 때문에 제거된다

 

◎ 메모리 영역 (static, heap)

  • static
    • class가 들어감 -> 메모리에 한번 할당되어 종료될 때까지 유지
  • heap
    • new 연산을 통해 생성된 객체 -> garbage collector 가 수시로 관리
    • 프로그램이 실행되는 동안 데이터가 수시로 바뀜

 

◎ 클래스와 소스파일

  • 일반적으로 하나의 소스파일에 하나의 클래스만 담는 것이 원직 
    • --> 귀찮다면 하나의 소스파일에 여러 클래스를 넣을 수 있다
  • 여러개의 클래스 중에서 public이 붙은 클래스의 이름과 소스파일의 이름이 일치해야한다
  • main() 메소드는 여러 클래스에 포함 될 수 있다
  • 실행시키고 싶은 main()이 들어있는 파일을 Run as 메뉴를 통해 실행시킨다

 

◎ 객체 생성과 사용

< 예제 3 객체 생성과 사용 >

  1. Box 클래스 작성
  2. 필드 : width, length, height
  3. Box 클래스를 정의하는 Box 객체 생성
  4. 가로 : 20, 세로 : 20, 높이 : 30 설정
  5. 가로, 세로, 높이 출력
public class Box {

	int width;
	int length;
	int height;
}
public class BoxTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Box myBox = new Box();
		myBox.width = 20;
		myBox.length = 20;
		myBox.height = 30;
		System.out.println("박스의 가로는: "+myBox.width+"
        	\n박스의 세로는: "+myBox.length+"\n박스의 높이는: "+myBox.height+"입니다");
	}
}

▽ console

더보기
예제 3 콘솔창