Language/Java

1) 객체 지향 프로그래밍 및 클래스 제작과 객체 생성 그리고 변수와 메서드)

지팡구 2022. 1. 17. 01:22

 

1) 객체지향적 코드의 예시

- 비객체지향적 코드 -
int hour1, hour2, hour3;
int minutel, minute2, minute3;
float second1, second2, second3;

int [] hour = new int[3];
int [] minute = new int[3];
float [] second = new float[3];

- 객체지향적 코드 - 

Time t1 = 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();

1) 객체지향 언어의 장점

 

1. 코드의 재사용성이 높다.(새로운 코드를 작성할 떄 기존의 코드를 이용하여 쉽게 작성이 가능)

2. 코드의 관리가 용이하다.(코드간의 관계를 이용해 적은 노력으로 쉽게 코드를 변경할 수 있음)

3. 신뢰성이 높은 프로그래밍이 가능함.

(제어자와 메서드를 이용해 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거해 코드의 불일치로 인한 오동작을 방지가능)

* 역할과 구현을 분리해 효율적이여서 규모가 큰 소프트웨어 개발에 주로 사용함.

 

객체 지향 언어의 장점을 간단히 단어로 설명하면 다음과 같다.

- 추상화

- 캡슐화

- 상속

- 다형성

 

1. 클라이언트는 대상의 역할(인터페이스)만 알면 된다.

 

2. 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.

 

3. 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.

 

4. 클라이언트는 구현 대상 자체를 변경해도 영향받지 않는다,

 

* 자바 언어의 다형성을 활용

( 역할= 인터페이스), 구현 (인터페이스를 구현한 클래스, 구현객체)

 

* 객체를 설계할 때 역할과 구현을 명확히 분리

 

*객체 설계시 역할(인터페이스)를 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기

 

수 많은 객체 클라이언트와 객체 서버는 서로 협력 관계를 가진다.

 

 

<객체>

2) 객체란?

세상에 존재하는 모든 것을 뜻하며, 프로그래밍에서 속성과 기능을 가지는 프로그램 단위.

 

ex ) 사람

속성 : 키, 몸무게

기능 : 의사

날씨 프로그램

속성 : 온도. 미세먼지

기능 : 날씨예보

 

다음 아래와 같이 코드를 작성할 수 있다.

1) 설계도인 Tv 클래스를 생성하는 과정
class Tv
{
		// 변수
        String color;
        int channel;
        boolean power;
    	
        // 메서드
        void power() {power=!power;}
        void channelUp() {++channel;}
        void channeldown() {--channel;}
}

보통 클래스를 선언하고 멤버변수와 메서드를 선언한다. 이 때 순서는 크게 관계없지만 일반적으로
메서드 보다는 멤버변수를 먼저 선언하고 멤버변수는 멤버변수끼리 메서드는 메서드끼리 모아 놓은 것이
일반적이다.

위의 코드와 같이 클래스를 선언하고 인스턴스를 생성하고 사용할 수 있다.
클래스의 선언은 단지 설계도를 작성하는 것이기에, TV 인스턴스를 생성해야 제품인 Tv를 사용가능.


2) Tv 인스턴스를 생성하는 과정
Tv t;
t = new Tv();

3) Tv 인스턴스의 해설

Tv클래스 타입의 참조변수 t의 선언
(이렇게 선언하면 메모리에 참조변수 t를 위한 공간이 마련되는데, 
아직 인스턴스 생선 전이라 아무것도 x)

연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성.
(아직 인스턴스의 값이 없기에 각 자료값에 해당하는 기본값으로 초기화 됨.)

<클래스>

 

3) 클래스란?

객체를 생성하기 위한 틀로 모든 객체는 클래스로부터 생성된다.

(그랜저라는 클래스를 만들어 색상과 바퀴, 배기량이 다른 여러개의 객체를 만들 수 있다.)

 

 

 

 

 

 

 

 

 

 

 

 

클래스는 속성(멤버 변수)와 기능(메서드)로 구성이 된다. 보통 프로그래밍에서 먼저 클래스를 만들고, 클래스로부터 객체를 생성해 사용하는데 그 과정에 대한 이해를 돕고자 위의 그림을 제작했다. 쉽게생각하면 클래스는 설계도라고 생각하면 된다. 객체는 속성과 기능, 두 종류의 구성요소로 이루어져 잇는데, 일반적으로 객체는 다수의 속성과 다수의 기능을 갖는다.

 

예시로&nbsp; 자전거를 들어보자면
(이렇게 클래스를 제작할 수 있다.)

 

 

<변수>

변수는 클래스변수, 인스턴스변수, 지역변수 모두 세 종류가 있는데, 변수의 종류를 결정짓는 중요한 요소는 '변수의 선언된 위치'이므로 변수의 종류를 파악하기 위해서는 변수가 어느 영역에 선언되었는지를 확인하는 것이 중요하다. 멤버변수를 제외한 나머지 변수들은 모두 지역변수이며, 멤버변수 중 static이 붙은것은 클래스변수, 붙지 않은 것은 인스턴스 변수이다.

 

변수의 종류 선언 위치 생성시기
클래스 변수
(class variable)
클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수
(instance variable)
인스턴스가 생성되었을 때
지역 변수
(local variable)
클래스 영역 이외의 영역
(메서드, 생성자, 초기화 블럭 내부)
변수 선언문이 수행되었을 때

 

 

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

 

1. 인스턴스 변수(instance variable)

- 클래스 영역에 선언, 클래스의 인스턴스를 생성할 때 만들어 짐. 

- 그래서 인스턴스 변수의 값을 읽어 오거나 저장하기 위해서는 먼저 인스턴스를 생성해야함.

- 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있으며 인스턴스마다 고유한 상태를 유지해야하는     속성의 경우, 인스턴스 변수로 선언해야함.

 

2. 클래스 변수(class variable)

- 클래스 변수를 선언하는 방법은 인스턴스 변수 앞에 static만 붙이면 해결.

- 독립적인 저장공간을 갖는 인스턴스 변수와 달리 클래스 변수는 모든 인스턴스가 공통된 저장공간(변수)를 공유함.

- public까지 앞에 붙이면 같은 프로그램 내에 어디서나 접근할 수 있는 '전역변수(global variable)'의 성격을 갖는다.

 

3. 지역 변수(local variable)

- 메서드 내에 선언되어 메서드 내에서만 사용가능

- '지역변수(local variable)'의 성격을 갖는다.

 

 

<메서드>

1) 메서드란?

' 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것'

 

2) 메서드의 장점

- 높은 재사용성

- 중복된 코드의 제거

- 프로그램의 구조화

 

3) 메서드의 선언과 호출

1) 일반적인 메서드의 선언 방법
public void getInfo(){
	System.out.println("a = " +a);
    System.out.println("b = " +b);
    System.out.println("c = " +c);
    System.out.println("d = " +d);
}

2) 메서드 선언에 대한 풀이
접근자 반환형 메서드 이름(매개변수) // 선언부
{
	
    메서드 구현시 수행될 코드  //구현부
}

3) 메서드 호출
ChildClass childclass= new ChildClass();
childClass.getInfo();


4) 예제를통한 메서드 선언과 호출

public class MainClass[
	public static void main(String[] args){
    	Childclass child1=newChildClass();
        child1.name="kim";
        child1.gender="M";
        child1.age=10;
        child1.getInfo();
    }
}
public class ChildClass{
	public String name;
    public String gender;
    public int age;
    
    public ChildClass(){
    	System.out.println("==childClass constructor==");
    }
    public void getInfo(){
	System.out.println("==getinfo() START==");
    System.out.println("name :  " +name);
    System.out.println("gender : " +gender);
    System.out.println("age : " +age);
}
}​

매개변수를 통해 메서드를 호출할 때 데이터를 전달할 수 있다.

중복 메서드(overloading)을 통해 이름은 같고 매개변수의 개수 또는 타입이 다른 메서드를 만들 수 있다.

메서드를 호출할 때 접근자에 따라 호출이 불가할 수 있다.