본문 바로가기

자바

Day05

객체 지향의 특성

1.코드의 재사용성이 높다 : 새로운 코드를 작성할 떄 기존의 코드를 이용하여 쉽게 작성할 수 있다.

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

3.신뢰성이 높은 프로그래밍을 가능하게 한다 : 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.

 

클래스와 객체의 차이점 

클래스: '객체를 정의해놓은 것' , '객체의 설계도 또는 틀' / 용도는 객체를 생성하는데 사용한다.

객체[object] :  '실제로 존재하는 것', '사물 또는 개념' / 기본 원시타입이 아닌 모든 데이터를 객체[참조변수]로 인식한다. 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고있다.

인스턴스 : 실체화된 인스턴스는 메모리에 할당된다. 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 갖고 있다. ex)Tv클래스로부터 만들어진 객체를 Tv클래스의 인스턴스라고 한다.

인스턴스는 객체에 포함된다. 

 

오버로딩[overloading]: 사전적의미는 '과적하다'로 보통 하나의 메서드 이름에 하나의 기능만을 구현해야하는데, 하나의 메서드 이름으로 여러 기능을 구현하기 때문에 붙여진 이름이다. 

오버로딩의 조건으로는 '메서드 이름이 같아야 하고', 매개변수의 개수 또는 타입이 달라야 한다.

overloading EX)
int add(int a, int b) {return a + b;}
String add(String x, String y, String z) {return x + y + z;}
long add(long a, long b) {return a  + b;}

생성자

:생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. 따라서 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용한다.

생성자의 조건 : 이름은 클래스의 이름과 같아야 하고 리턴 값이 없다.  [호출되어 실행되는 우선순위 1순위]

class Tv {
	int age;
    String name;
	Tv() { } //매개변수가 없는 생성자 ->기본 생성자
    Tv(int a, String b) { //매개변수가 있는 생성자 ->  인스턴스를 생성하는 동시에 원하는 값으로 
    	age = a; , name = b; //초기화가 가능하다.
    } 
    //수행과정 1. 연산자new에 의해서 메모리[heap]에 Tv클래스의 인스턴스가 생성된다.
    2. 생성자 Tv()가 호출되어 수행된다.
    3.연산자 new의 결과로, 생성된 Tv인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

※여기서, 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것은 아니다.

생성자에서 다른 생성자 호출하기 this(),this 

생성자의 이름에서 클래스이름 대신 this를 사용한다. 한 생성자에서 다른 생성자를 호출할때는 반드시 첫 줄에서만 호출이 가능하다.

class Car3 {
	String color;
	String gearType;
	int door;
	Car3() {
		this("white","auto", 4); // Car3(String color, String gearType, int door)를 호출
	}
	Car3(Car3 c) {
		color = c.color;
		gearType = c.gearType;
		door = c.door;
	}
	Car3(String color, String gearType, int door) {
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}
}

인스턴스를 생성할 때는 다음의2가지 사항을 결정해야한다.

1.클래스 : 어떤 클래스의 인스턴스를 생성할 것인가?

2.생성자 : 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?

 

변수의 초기화 : 변수를 선언하고 처음으로 값을 저장하는 것을 '변수의 초기화'라고 한다.

멤버변수는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지므로 초기화하지 않고 사용해도 되지만, 지역변수는 사용하기 전에 반드시 초기화해야 한다.

encapsulation[캡슐화] : 데이터와 코드의 형태를 외부로부터 알 수없게 하고, 데이터의 구조와 역활, 기능을 하나의 캡슐형태로 만드는 방법이다.

접근 제어자[access modifier]: public, default , private, protected : 멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역활을 한다.

접근 제어자를 사용하는 이유 : 외부로부터 데이터를 보호하기 위해서 , 외부에는 불필요한,내부적으로만 사용되는,부분을 감추기 위해서 

public : 접근 제한이 없다. 

default : 같은 패키지 내에서만 접근이 가능하다.

private : 같은 클래스 내에서만 접근이 가능하다. 

setter 와 getter : private 변수를 외부에서 접근하게 하려면 public 메서드를 제공한다. 

setter : 값을 지정하는 set() 메서드 [writer]

getter : 값을 얻는 get() 메서드  [reader]

연습문제 - 공통적으로 접근할 값에 정적필드[static] 를 선언하지 못해 고민만하다 구글링으로 문제해결...

public class BBSItem {
	int seqNo; //일련번호 필드
	String writer; //작성자 필드
	String writtenDate; //작성일자 필드
	String title; // 제목필드
	String content; // 내용필드
	//모든 객체가 공통적으로 접근할 데이터는 정적 필드로 선언해야 한다.
	//그러므로 마지막 일련번호를 모든 객체가 공통적으로 접근할 데이터는 정적 필드로 선언해야 합니다. 
	//생성자에서 그 필드를 사용하여 seqNo 필드의 값을 설정한 후 정적 필드의 값을 1만큼 증가시키면 됩니다.


	static int count = 0; //정적 필드로 마지막 일련번호 선언 

	public BBSItem(int seqNo, String writer, String writtenDate, 
					String title, String content) {
	
		this.seqNo = ++count; //생성자에서 새로운 객체를 만들때마다 일련번호에 정적필드 값을 1만큼 증가
		this.writer = writer;
		this.writtenDate = writtenDate;
		this.title = title;
		this.content = content;
	}
package com.work;
import com.work.BBSItem;
public class PrintBBS {

	public static void main(String[] args) {
		BBSItem bbs = new BBSItem(0, "kim","17:50", "자바", "1234");
		BBSItem bbs1 = new BBSItem(0, "park", "18:00 ", "공부", "5678");
		BBSItem bbs2 = new BBSItem(0, "jay", "18:10 ", "하자", "9012");
		printBbsItem(bbs);
		printBbsItem(bbs1);
		printBbsItem(bbs2);
	}
	static void printBbsItem(BBSItem bbs) {	
		
		System.out.println(bbs.seqNo);
		System.out.println(bbs.writer);
		System.out.println(bbs.writtenDate);
		System.out.println(bbs.title);
		System.out.println(bbs.content);
		System.out.println("------여백-----");
		}
	}

'자바' 카테고리의 다른 글

Day07  (0) 2021.05.13
Day06  (0) 2021.05.11
1주차 예제를 통한 간단한 복습  (0) 2021.05.09
Day04  (0) 2021.05.07
Day03  (0) 2021.05.06