JAVA Programming

Growing_HJ·2024년 5월 28일

일기장

목록 보기
8/51

2024.05.23.THU <D+3> ,객체지향
A. 객체지향의 장점

  • 코드의 재사용성이 높다. -> 기존 코드를 활용
  • 코드의 관리가 용이하다. -> 쉽게 코드를 변경
  • 신뢰성이 높은 프로그래밍을 가능하게 한다. -> 재사용성이 높고, 변경이 용이하여 코드의 불일치가 줄어듬.
    B. 클래스와 객체
  1. Class (클래스)
  • 객체를 정의해 놓은 것. 객체 생성시 사용.
    변수 -> 배열 -> 구조체 (C언어, 여러가지 기본형 타입을 하나로 묶음)
    + stuGrade = (학생 정보, 교과목 정보, 평가 정보)
    학생 성적을 관리할 수 있는 새로운 자료형
    + 단점: 정보만 관리되고 있어, 기능이 없음
    + 학생의 주소를 쉽게 변경할 수 있는 기능이 없음.
    -> 클래스 = 정보(학생 정보, 교과목 정보, 평가 정보) + 기능(주소 변경)
    정보 => 속성, 필드, 멤버변수 / 기능 : 메소드, 함수
    + String Class
    -> 정보 (Char 배열), 대문자 바꾸기, 잘라내기, 치환하기 기능등이 존재.
    C. Object (객체)
  1. 객체의 정의 : 실제로 존재하는 것. 사물 또는 개념
  2. 객체의 용도 : 객체가 가지고 있는 기능과 속성(정보)에 따라 다름.
  • 객체를 사용한다는 것은 객체가 가지고 있는 속성과 기능을 사용한다는 의미.
  1. 유형의 객체: ex) 컴퓨터, 강의실, 학생 등 (눈에 보이지 않는 것)
  2. 무형의 객체: ex) 논리적인 것. (눈에 보이지 않는 것.)

D. Object & instance (객체와 인스턴스)
=> 인스턴스화: 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 함 (메모리에 로딩(적재)하는 행위)
=> 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 함.
=> 인스턴스화는 객체라고 함. ("instance = Object"가 성립)

E. 객체의 구성요소
1. 속성 (Property) : 멤버변수, 필드, 상태, 특성
2. 기능 (fuction) : 메소드, 함수, 행위

  • 인스턴스는 참조변수를 통해서만 접근이 가능.
  • 참조변수의 타입은 인스턴스의 타입과 일치해야 함.

F. 객체 배열 - 객체배열에 저장되는 값은 instance의 주소값.

G. 변수와 메소드
1. 변수의 종류

  • 클래스 변수: 모든 인스턴스에서 공유할 수 있는 변수 (ex. card 클래스가 클래스 변수의 예시)
  • 인스턴스 변수: 인스턴스마다 고유한 상태를 유지해야 하는 변수. 객체가 생성이 되어야만 사용이 가능
  • 지역 변수: 해당 block(블럭, 구역) 에서만 사용이 가능하고, 그 범위를 벗어나면 사용할 수 없게 되는 변수
  • 매개 변수: 메소드 내에 선언된 변수
  • 매개 변수의 종류
  1. 기본형 매개변수 : 변수의 값을 읽기만 할 수 있음(원본 수정이 불가능. read only)

  2. 참조형 매개변수 : 변수의 값을 읽고 수정할 수 있음 (원본 수정이 가능. read & write)

  3. method (메소드)
    => 특정 삭업을 수행하는 일련의 문장들의 묶음
    -메소드 사용이유: 높은 재사용성, 중복된 코드의 감소, 프로그램의 구조화, 리팩토링시, 메소드를 자주 활용하게 됨.

  • 구조: 선언부 (메소드의 머리), 구현부 (메소드의 몸통)
  • 반환타입의 메소드
  1. 반환이 없을 경우 : void사용
  2. 반환이 있을 경우 : 반환형에 맞추어서 반환타입을 사용. 마지막에 return 을 사용. 반환타입과 return 타입은 동일해야 함.

참조형 반환타입: 참조변수의 값(instance의 주소)이 반환(return)

H. 클래스 메소드와 인스턴스 메소드
1. 클래스 메소드 - static 키워드를 사용. (인스턴스와 관계 없는 작업을 수행)
2. 인스턴스 메소드 - static 키워드를 사용하지 않음. (인스턴스 변수와 관련된 작업을 수행. 인스턴스로 생성되어야만 호출이 가능)
=> 클래스 설계 시, 멤버 변수 중 모든 인스턴스에 공통으로 사용 하는 것에 static를 붙인다.
=> 클래스 변수 (static 변수)는 인스턴스를 생성하지 않아도 사용이 가능하다.
=> 클래스 메소드 (static 메소드)는 인스턴스 변수를 사용할 수 없다.
=> 메소드 내에서 인스턴스 변수를 사용하지 않다면, static을 붙이는 것을 고려한다.
클래스 변수 & 인스턴스 변수 에제코드)

class Tv{
	// 속성, 멤버변수 
	String color;
	boolean power;
	private int channel; //private는 접근제어지시자. 
	
	// channel setter (세터 - 멤버변수의 값을 변경, 생성)
	// public은 접근제어지시자
	// void는 반환하는 값이 없음. 
	public void setChannel (int ch) {
		//1. 유효한 channel(값)인지 체크. 
		if (ch < 0)	
			{ return ; } //채널이 음수이면 적용하지 않음.
		channel = ch; //양수이면 멤버변수에 적용. 
	}
	// channel에 대한 getter(게터) 멤버변수의 값을 조회
	public int getChannel() {
		return channel;
	}
	// 기능, 메소드 구현하기 
	// power = boolean, 논리형 = 참 & 거짓으로 판단 ( !=> 부정 연산자) 
	void power() {power = !power;}
	void channelUp() { ++channel; }
	void channelDown() { --channel; }
}
public class Television {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Tv t ; // Tv변수만 선언된 상태, 인스턴스(메모리 적재) 상태는 아님.
			   // t는 참조변수이고, 참조변수가 초기화가 안된 상태
			   // 기본 초기화인 상태 => null 로 초기화가 되어 있는 것. 
		t = new Tv();  //t라는 참조 변수가 null에서 실제 Tv 객체의 주소로 초기화됨. 객체로 로딩
					   //즉, 사용할 수 있는 상태. 멤버변수 접근이 가능하고, 메소드 호출도 가능.
		//ex) 멤버변수 초기화 전의 상태.
		/**
		 *color => null
		 *power => false
		 *channel => 0**/
		//멤버변수 초기화
		/**
		 * t.channel =  10;
		 * t.channel =- 100; // 논리적으로 채널이 마이너스인 경우는 없음
		 * 					 // 문제점: 멤버변수를 함부로 접근하면 안됨.
		 * 					 // 해결방안: 직접접근이 아닌 간접접근이 되도록 하는 기능
		 * 					 // 체크해서 문제가 없다면 멤버변수에 적용
		 * 					 // 정리 1=> 멤버변수에 접근제어자가 필요
		 * 							2=> 메소드가 필요 (setter,세터) **/
		t.setChannel(-100);
		System.out.println(t.getChannel());
		
		t.channelUp();
		System.out.println(t.getChannel());
		
		t.channelDown();
		System.out.println(t.getChannel());
		
		t.channelUp();
		System.out.println(t.getChannel());
		
		// Tv 객체배열 
		Tv t3, t4, t5; // 변수 3개로 관리하게 됨. Tv가 1000개 일 경우,변수도 1000개 필요.,
		Tv[] tvArr = new Tv[3]; // 하나의 배열로 3개의 Tv를 관리, Tv가 1000대라도 변수는 1개
		// 위의 new Tv는 자세히보면 ()가 없음.
		// 객체 3개로 만들어질 것이라고 생각하면 안됨! 
		//=> 단지, 주소값 3개를 저장할 수 있는 배열이 만들어진 상태 일 뿐임. 
		// 따라서, 3개의 요소는 모두 null상태.
		// 각 요소에 객체를 생성해서 그 객체의 주소값을 배열의 요소에 저장해야 함.
		// (위의 과정을 마친 후) 객체배열을 생각한대로 사용이 가능해짐.
		
		// + 객체 배열의 요소 초기화하기
		// tvArr[] = {new Tv(), new Tv(), new Tv()};
		tvArr[0] = new Tv();
		tvArr[1] = new Tv();
		tvArr[2] = new Tv();
	}
}

I. 오버로딩.

  • 한 클래스 내에서 같은 이름의 메소드를 여러개 정의하는 것.
    조건: 메소드 이름이 동일해야 함. 매개변수의 개수와 타입으로 구분함.
    (static, method의 반환타입은 조건에 해당하지 않음!)
    ! 오버로딩의 장점: 메소드의 이름만 보더라도 이 메소드의 기능을 예상할 수 있음, 메소드의 이름을 절약할 수 있음

J. 생성자
=> 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'임.
=> 인스턴스의 초기화 작업에 주로 사용됨.
=> 인스턴스 생성 시, 실행되어야 할 작업을 위해서도 사용됨.
1. 생성자의 특징 : 구조가 메소드와 유사, 차이점은 반환값이 없음 (void 사용 X)

  • 작성 방법: 생성자의 이름이 클래스 이름과 동일해야 함.
  • 생성자를 통한 인스턴스 생성
    ex) java MyMath mm = new MyMath(); // 현재의 생성자는 코드에 없음, 컴파일러가 기본적으로 제공해줌 !!

0개의 댓글