자바의 정석- 객체지향 프로그래밍(클래스와 메서드)

jadive study·2022년 11월 20일
0

객체지향이란

많은 시간과 비용을 절약할 수 있었다. 객체지향이론은 상속,캡슐화,추상화 개념을 중심으로 점차 구체적으로 발전한다.

1.2 객체지향언어

  1. 코드의 재사용성이 높다.
    새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
  2. 코드의 관리가 용이하다.
    코드간의관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.

2. 클래스와 객체

클래스의 정의ᅳ클래스란 객체를 정의해 놓은 것이다.
클래스의 용도- 큘래스는 객체를 생성하는데 사용된다.

클래스를 정의하고 클래스를 통해 객체를 생성하는 이유는 설계도를 통해서 제품을 만드 는 이유와 같다.

2.2 객체와 인스턴스

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고한다

속성(property)- 멤버변수(member variable), 특성(attribute》, 필드(field), 상태(state)
기능(function)- 메서드(method), 함수(function), 행위(behavior)

클래스명 변수명;//클래스의 객체를 참조하기 위한 참조변수 선언
변수명 = new 클래스명(); //클래스의 객체 생성, 주소를 참조변수에 저장
Tv t;//TV 클래스타입의 참조변수t를 선언
t = new Tv();//TV인스턴스 생성, 생성된 TV인스턴스의 주소를 t에 저장

  1. Tv t;
    Tv클래스 타입의 참조변수 t를 선언한다. 메모리에 참조변수 t를 위한 공간이 마련

  2. t = new Tv();
    연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성된다.

-같은 클래스로부터 생성되었을지라도 각 인스턴스의 속성(멤버변수)은 서로 다른 값을 유지할 수 있으며,메서드의 내용은 모든 인스턴스에 대해 동일하다.

System.out.printin(”tl의 channel값은 ”+tl.channel+”입니다.");
System.out.printin「't2의 channel값은 ”+t2.channel+”입니다.”》;
이제 t1. t2 모두 같은 Tv클래스의 인스턴스를 가리키고 있기 때문에 tl.channel과 t2.channel의 값은 7이며 다음과 같은 결과가 화면에 출력된다.

참조변수에는 하나의 값(주소)만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 가리키는(참조하는) 것은 가능하지만 하나의 참조변
수로 여러 개의 인스턴스를 가리키는 것은 가능하지 않다.

System.out.printin(”tl의 chaMel값은 ”+tl.channel+”입니다.");
System.out.printin「't2의 chaMel값은 ”+t2.ch레nel+”입니다.”》;

이제 t1. t2 모두 같은 Tv클래스의 인스턴스를 가리키고 있기 때문에 tl.channel과 t2.channel의값은 7이며 다음과 같은 결과가 화면에 출력된다.
tl의 channel값은 7입니다.
t2의 channel값은 7입니다.

이 예제에서 알 수 있듯이. 참조변수에는 하나의 값(주소)만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 가리키는(참조하는) 것은 가능하지만 하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 가능하지 않다.

2.5 객체 배열

객체 역시 배열로 다루는 것이 가능 객체 배열 안에 객체가 저장되는 것은 아니고, 객체의 주소가 저장 객체 배열을 생성하는 것은,그저 객체를 다루기 위한 참조변수들이 만들 어 진 것일 뿐,아직 객체가 저장되지 않았다. 객체를 생성해서 객체 배열의 각 요소에 저장히는 것을 잊으면 안 된다.

Tv[] tvArr = new Tv[3]; // 참조변수 배열 (객체 배열)을 생성
// 객체를 생성해서 배열의 각 요소에 저장

tvArr[0] = new Tv();
tvArr [1] = new Tv();
tvArr [2] = new Tv();

배열의 초기화 블럭을 사용하면, 다음과 같이 한 줄로 간단히 할 수 있다.

Tv [ ] tvArr = ( new Tv (), new Tv (), new Tv() };

다뤄야할 객체의 수가 많을 때는 for문을 사용하면 된다.

Tv[] tvArr = new Tv[100];
for(int i=O;i<tvArr.length;i++) {
tvArr[i] = new Tv(); 
}

2.6 클래스의 또 다른 정의

-클래스는
•객체를 생성하기 위한 틀’이며 ‘클래스는 속성과 기능으로 정의되어있다.

  1. 클래스 - 데이터와 함수의 결합

자바와 같은 객체지향언어에서는 변수(데이터)와 함수를 하나의 클래스에 정의하여 서로 관개 가 깊은 변수와 함수들을 함께 다룰 수 있게 했다.

public final String implements java.io.Serializable, Comparable{
private char[] value;  // 문자열을저장하기위한 공간 
public String replace (char oldChar, char newChar) {
char[] val = value; // 같은 클래스 내의 변수를 사용해서 작업을 한다. 
}     
  1. 클래스 一 사용자정의 타입 (user-defined type)
    자료형(primitive type),사용자정의 타입(user-defined type) 이라고 한다.
    다른 프로그래밍언어에서도 사용자정의 타입을 정의할 수 있는 방법을 제공하고 있으며 자바와 같은 객체지향언어에서는 클래스가 곧 사용자 정의 타입이다.
int[]  hour   = new int[3]; 
int[]  minute = new int[3]; 
float [] second = new float[3];

-> 데이터 개수가 많으면 이런 식으로 곤란

class Time {
int hour; 
int minute; 
float second;
}

비객체지향 코드
int hourl, hour2, hour3;
int minutel, minute2, minute3;
float secondl, second2, second3;

객체지향적 코드

Time tl = new Time( );
Time t2 = new Time( );
Time t3 = new Time( );
Time [ ] t = new Time [3]; 
t[0] = new Time《 );
t[1] = new Time( ); 
t[2] = new Time( );

제어자와 메서드를 이용해서 이러한 조건들을 코드에 쉽게반영
배우지는 않았지만, 위의 조건들을 반영하여 Time클래스를 작성

public class Time {
private int hour;
private int minute; 
private float second;
public int getHour()	{return hour;	}
public int getMinute()	{return minute;}
public float getSecond() {return second;}
public void setHour(int h) {
if (h < 0 || h > 23) return; 
hour = h;
}
public void setMinute(int m) {
if (m < 0 || m > 59) return; 
minute =m;
}
public void setSecond(float s) {
	if(s < 0.0f || s >59.99f) return;
    second =s;
    }
 }

3. 변수와 메서드

3.1 선언위치에 따른 변수의 종류

class Variables
{
	int iv; //인스턴스 변수 
    static int cv;//클래스변수(static변수, 공유변수)-> 클래스 영역
    
    void method()
    {
    	int lv = 0; //지역변수 -> 메서드 영역
    }
}

  1. 인스턴스변수 (instance variable)
    클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다.
    인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.

  2. 클래스변수 (class variable)
    인스턴스변수 앞에 static을 붙이기반 하면 된다.

  3. 지역변수 (local variable)
    메서드 내에 선언되어 메서드 내에서만 사용가능-while문의 블럭 내에 선언된 지역변수

3.2 클래스변수와 인스턴스변수

Card클래스의 큼래스변수(static변수)인 width, height는 Card끝래스의 인스턴스블 생성하지 않고도 •클래스이름.클래스변수’와 같은 방식으로 사용 할 수 있다.

인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값 유지, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유.

profile
개발 메모창고

0개의 댓글