티스토리 뷰

※ 객체지향이 무엇인가? 

- 부품 객체를 먼저 만들고 이것들을 하나씩 조립해서 완성된 프로그램을 만드는 기법이다. 

   여기서 부품도 객체이고, 전체로 만들어진 것도 객체이다. 

-> 여기서 아래에 나올 객체의 특징과 객체의 상호 작용, 객체의 관계3가지를 모두 설명한 뒤에

이 모든것이 객체 지향 프로그래밍이라고 말해야 한다. 

 

※ 객체(Object)

- 객체는 이름이 있어야 한다. 

- 속성 : 데이터 속성은 반드시 있어야 한다. (필드)

- 동작 : 동작은 있을수도 없을 수도 있다. 

 

현실객체를 프로그래밍하는 것을 객체지향 모델링이라고 한다. 

 

※ 객체의 상호 작용

▶객체를 사용한다 - 객체가 가진 동작이나 속성을 이용한다. 

기능을 실행하도록 요청하는 것

==> 메소드 호출(객체가 다른 객체가 가진 메소드를 호출하면서 해당 기능을 요청한다. )

메소드가 호출되어서 실행 결과를 전달해주는 것을 return 이라고 한다. 

 

※ Method vs Function

Method : 객체가 있어야 한다. 객체가 가진 동작을 메소드라고 한다.

Function : 단순히 실행 코드를 묶어 놓은 것이다. 객체 개념이 없다. 

- 자바는 method는 존재하고, function이 없다. 

- 자바스크립트는 method와 function 개념이 둘 다 존재한다. 

 

 

[객체간의 관계 3가지]

- 객체 지향 프로그램에서는 객체는 다른 객체와 관계를 맺고 있다. 

1.  집합 관계 : 완성품과 부품의 관계

2. 사용 관계 : 객체가 다른 객체를 사용하는 관계

3. 상속 관계 : 종류 객체와 구체적인 사물 객체 관계 

 

 

[객체 지향 프로그래밍의 특징(캡슐화, 상속, 다형성)]

1. 캡슐화 (== 보호) 

: 객체안의 데이터(객체의 속성이나 기능)를 보호하는 것이다. 

 

2. 상속

: 부모가 가진 것을 물려받은 것을 재사용할 수 있다. 

 

[상속의 효과]

1. 중복 코드를 줄여준다.

2. 유지 보수 편리하다.

3. 객체의 다형성을 구현할 수 있다. 

 

3. 다형성

:  사용방법은 같은데 실행결과가 다르게 나온다. 


[객체(Object)와 클래스(Class)]

 객체를 생성하는 순서

[클래스]

※ 클래스 이름

: 한글X, 첫자는 대문자, 첫자에 숫자 X

 

※ 클래스 선언과 컴파일

: 소스 파일당 하나의 클래스를 선언하는 것이 관례이지만 두 개 이상의 클래스도 선언이 가능

단, 소스파일 이름과 동일한 클래스만 public으로 선언할 수 있다. 

선언한 개수만큼 바이트 코드 파일이 생성된다. 

 

[객체 생성과 클래스 변수]

1. new 연산자 

: 객체를 생성하는 역할을 한다. 

: 생성된 객체는 힙 메모리 영역에 생성된다. 

 

2. 클래스 변수 (참조 타입 변수)

: new 연산자에 의해 리턴된 객체의 번지를 저장하는 변수이다. 

: 힙 영역의 객체를 사용하기 위해 사용된다. 

- 하나의 클래스로 여러 개의 객체를 만들 수 있다. 

- new는 항상 새로운 객체 생성 

 

[필드, 메소드, 생성자]

1.  생성자 : 객체를 만들기 위해서 사용하는 것

2. 필드, 메소드  : 객체가 만들어지고 나서 사용하는 것, 객체를 이용하기 위한 것 

 

=> 클래스 블록에 변수 형태로 선언된 것들은 변수라고 부르면 안되고 필드라고 불러야 한다. 

클래스 상에 필드를 선언만 하면, 0의 의미인 타입별 기본 값으로 초기화된다. 

public class Car {

	String company;  // 값이 없는 것이 아니라 참조변수타입은 null로 초기화 되어 있다.
    String model;
    String color;
    int maxSpeed; // 값이 없는 것이 아니라 0으로 초기화 되어 있다. 
    
    Body body; // 참조변수타입은 null로 초기화 되어 있다. 
}

[생성자]

: 객체를 생성할 때만 쓰고 객체를 생성하고 난 후에는 쓰지 않는다. 

 

※ 기본 생성자 (Default Constructor)

: 모든 클래스는 생성자가 반드시 존재하며 하나 이상을 가질 수 있다. 

: 생성자 선언을 생략하면 컴파일러는 기본 생성자를 추가시킨다. 

 

this : 객체 자신을 가리킨다. 

 

 생성자 오버로딩 (Constructor Overloading)

- 자바는 매개변수의 타입으로 생성자를 식별한다. 

- 생성자의 매개변수 타입의 순서를 구별한다. 

package pr06.exam05;

public class Korean {

	// Field - 밑에서 선언하더라도 위에서 사용할 수 있다. 
	// 일반 변수는 미리 선언되어야 사용할 수 있다. 
	String nation = "한국";
	String name;
	String ssn;
	int age;

	// Constructor Overloading 
	Korean(){ // this는 객체 자신을 가리킨다. 
		this("angelatto", "000000-0000000"); // this()는 내가(객체 자신)이 가진 생성자를 호출하겠다. 
		//주의 : 생성자 메소드 안에서 생성자를 호출할 때는 생성자가 가장 먼저 호출되어야 한다. 
		System.out.println("Korean() 실행");
	}
	
	Korean(String name) {
		this(name, "000000-0000000", 1);
		System.out.println("Korean(String name) 실행");
	}
	
	Korean(String name, String ssn) {
		this(name, ssn, 1);
		System.out.println("Korean(String name, String ssn) 실행");
	}
	
	Korean(String name, String ssn, int age) {
		this.name = name; 
		this.ssn = ssn; 
		this.age = 1;
	}
	
	Korean(String name, int age, String ssn) {
		this(name, ssn, 1);
	}
	
	
}

 

[메소드]

※ 메소드와 필드 이름

: 한글X, 첫자는 소문자, 첫자에 숫자 X

 

※ 매개변수 선언 

▶ 매개변수의 수를 모를 경우

1. 방법1 

int sum1(int[] values) { }
		
int[] values = {1, 2, 3};
int result = sum1(values);
int result = sum1(new int[] {1,2,3,4,5});

 

2. 방법2 - 가변길이의 매개변수. 

아래의 values 너도 배열이다. 

int sum2(int ... values) { }
		
int result = sum2(1, 2, 3);
int result = sum2(1, 2, 3, 4, 5);
		

=> 두 방법의 차이

: 메소드를 호출할 때 다르다.

// 방법1 
int getSum(int[] values) {   // 메소드를 호출할 때 배열의 크기가 결정된다. 
	int result = 0;
	for(int value : values) {
		result += value;
	}
	return result;
}

sum = bs.getSum(new int[] {1, 2, 3});


// 방법2 - 가변인자 
int getSum2(int ... values) { 
	int result = 0;
	for(int value : values) {
		result += value;
	}
	return result;
}
    
sum = bs.getSum2(1, 2, 3);
sum = bs.getSum2(1, 2, 3, 4, 5);