보글보글 개발일지
article thumbnail
반응형
  • 객체란? 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것.
    • 속성과 동작으로 구성. 
    • 사람은 이름, 나이 등의 속성 + 웃다, 걷다 등의 동작
    • 속성: 필드, 동작: 메소드
  • 객체 모델링: 현실 세계의 객체를 소프트웨어 객체로 설계하는 것
  • 객체의 상호작용: 객체들은 각각 독립적으로 존재, 다른 객체와 서로 상호작용하며 동작
    • 메소드: 객체들 사이의 상호작용 수단
    • 메소드 호출: 객체가 다른 객체의 기능을 이용
    • 도트 연산자: 객체의 필드와 메소드에 접근할 때 필요
  • 객체 지향 프로그래밍: 만들고자하는 완성품인 객체를 모델링, 집합 관계에 있는 부품 객체와 사용관계에 있는 객체를 하나씩 설계한 후 조립
  • 객체 지향 프로그래밍의 특징
    • 캡슐화(Encapsulation): 객체의 필드, 메소드를 하나로 묶고 실제 구현 내용을 감추는 것
      • 외부 객체는 객체 내부 구조를 알지 못하고, 객체가 노출해서 제공하는 필드와 메소드만 이용 가능
      • 보호 이유: 외부의 잘못된 사용으로 인해 객체 손상되지 않도록
      • 접근 제한자: 캡슐화된 멤버 노출시키거나 숨길지 결정
    • 상속(Inheritance): 상위 객체의 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 함
    • 다형성(Polymorphism): 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
      • 부모 클래스 또는 인터페이스의 타입 변환 허용
      • 부모 타입에는 모든 자식 객체 대입 가능, 인터페이스 타입에는 모든 구현 객체 대입 가능
      • ex) 자동차는 타이어 타입으로 한국 타이어, 금호를 이용하지만 각 타이어의 성능은 다름
  • 객체와 클래스
    • 자동차를 만들 때 설계도를 보고 만들듯, 객체 지향 프로그래밍에서도 설계도(Class)로 해당 객체를 만들어야함.
    • 클래스에는 객체를 생성하기 위한 필드와 메소드 정의되어 있음.
    • 인스턴스(instance): 클래스로부터 만들어진 객체
    • 인스턴스화: 클래스로부터 객체를 만드는 과정
    • 하나의 클래스로부터 여러 개의 인스턴스 만들 수 있음.
    • 객체 지향 프로그래밍 개발의 세 가지 단계
      • 1. 클래스 설계
      • 2. 설계된 클래스를 가지고 사용할 객체 생성
      • 3. 생성된 객체 이용
  • 클래스 선언: 소스 파일은 클래스 선언을 담고 있는 저장 단위. 클래스 자체가 아님 
    • 소스 파일에 두개 이상의 클래스를 선언하는 것도 가능하나 public 접근 제한자는 파일 이름과 동일한 이름의 클래스 선언에만 붙일 수 있다.
    • 가급적 소스 파일 하나당 동일한 이름의 클래스 하나를 선언하는 것이 좋음
  • 객체 생성, 클래스 변수
    • new 클래스(); 로 객체 생성. 
    • new는 클래스로부터 객체 생성하는 연산자
    • 클래스(): new 연산자 뒤에 오는 생성자 -> 메모리 힙 영역에 생성됨
    • new 연산자는 힙 영역에 객체 생성 시킨 후, 객체의 주소를 리턴. 이 주소를 참조 타입인 클래스 변수에 저장해두고 객체 사용.
      • 클래스 변수;
      • 변수 = new 클래스();
    • Student 클래스는 하나이지만 new 연산자를 사용한 만큼 객체가 메모리에 생성됨. 이러한 객체들은 Student 클래스의 인스턴스.
    • 같은 클래스로부터 생성되었지만 각 객체는 고유 데이터 가지며 메모리에서 활동. s1, s2가 참조하는 Student 객체는 완전히 독립된 서로 다른 객체

  • 클래스의 두가지 용도 
    • 1. 라이브러리(API: Application Program Interface): 다른 클래스에서 이용할 목적으로 설계됨
    • 2. 실행용
    • 프로그램 전체 클래스 100개라면 99개 라이브러리, 1개 실행 클래스 (main()메소드 제공역할)
    • 위의 예제에서 Student는 라이브러리 클래스, StudentExample은 실행 클래스
    • Student에 메인 메소드를 작성해서 라이브러리인 동시에 실행 클래스로 만들 수 있으나 객체 지향 프로그램은  대부분 라이브러리와 실행 클래스 분맇ㅁ.
  • 클래스의 구성 멤버: 필드, 생성자, 메소드
    • 필드: 객체의 데이터가 저장되는 곳. 
      • 변수와의 차이: 변수는 생성자와 메소드 내에서만 사용, 생성자와 메소드가 실행 종료되면 자동 소멸. 필드는 생성자와 메소드 전체에서 사용, 객체가 생성되지 않는 한 객체와 함께 존재
      • ex_ int fieldName;
    • 생성자: 객체 생성 시 초기화 역할 담당. 필드 초기화 하거나 메소드 호출해서 객체 사용할 준비함
      • ex_ ClassName() { ... }
    • 메소드: 객체의 동작에 해당하는 실행 블록
      • ex_ void methodName() { ... }
  • 필드
    • 객체의 고유 데이터, 부품, 상태 데이터 저장.
    • 필드 선언: 생성자 선언과 메소드 선언의 앞과 뒤에 가능
    • 클래스 외부에서 사용할 경우 클래스로부터 객체를 생성한 뒤 필드 사용해야함
    • why?  필드는 객체에 소속된 데이터이므로 객체가 존재하지 않으면 필드도 존재하지 않음

  • 생성자: new랑 같이 사용. 클래스로부터 객체 생성할 때 호출되어 객체의 초기화 담당(필드 초기화 or메소드 호출해서 객체 사용할 때 준비)
    • 기본 생성자: 모든 클래스에 하나의 생성자 존재. 생략시 기본 생성자 컴파일러가 자동 추가
    • 생성자 오버로딩: 다양한 방법으로 객체 생성 가능. 매개변수를 달리하는 생성자 여러개 선언
      • 매개값의 타입과 수에 의해 호출될 생성자 결정
    • 생성자 오버로딩 많으면 중복 코드 많아진다. 필드 초기화 내용은 한 생성자에만 집중 작성, 나머지 생성자는 초기화 내용 가진 생성자 호출! this 사용해서 호출한다.
      • this()는 자신의 다른 생성자 호출하는 코드. 생성자의 첫줄에서만 허용. 
      • this()의 매개값은 호출되는 생성자의 매개변수 타입에 맞게 제공. this() 다음에 추가적인 실행문 올 수 있다. 호출되는 생성자의 실행이 끝나면 원래 생성자로 돌아와서 다음 실행문 진행
package chap06;

public class Car {
	//field
	String company = "현대";
	String model;
	String color;
	int maxSpeed;
	//생성자
	Car(){
		
	}
	Car(String model){
		this(model,"은색",250); //맨 마지막 생성자 호출
	}
	Car(String model,String color){
		this(model,color,250);
	}
	Car(String model,String color,int maxSpeed){
		this.model = model;
		this.color = color;
		this.maxSpeed = maxSpeed;
	}

}

 

  • 메소드: 객체의 동작에 해당하는 중괄호 {} 블록.
    • 필드 읽고 수정하는 역할 
    • 다른 객체 생성해서 다양한 기능 수행
    • 객체간 데이터 전달의 수단 - 외부로부터 매개값 받을 수도, 실행 후 어떤 값 리턴할 수도 있다
    • 메소드 선언: 선언부(리턴타입, 메소드이름, 매개변수 선언) / 실행블록
    • 매개 변수의 수를 모를 경우: 매개 변수를 배열 타입으로 선언 / int ... values로 선언
package chap06;
//매개변수의 수를 모를 경우
public class Computer {
	int sum1(int[] values) {
		int sum=0;
		for(int i=0;i<values.length;i++) {
			sum+= values[i];
		}
		return sum;
	}
	int sum2(int ...values) {
		int sum=0;
		for(int i=0;i<values.length;i++) {
			sum+= values[i];
		}
		return sum;
	}
}
package chap06;
//ComputerExample.java
public class ComputerExample {
	public static void main(String[] args) {
		Computer myCom = new Computer();
		
		int[] values1 = {1,2,3};
		int result1 = myCom.sum1(values1);
		System.out.println("result1: "+result1);
		
		int result2 = myCom.sum1(new int[] {1,2,3,4,5});
		System.out.println("result2: "+result2);
		
		int result3 = myCom.sum2(1,2,3);
		System.out.println("result3: "+result3);
		
		int result4 = myCom.sum2(1,2,3,4,5);
		System.out.println("result4: "+result4);
	}
}
  • 인스턴스 멤버: 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드 
    • 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this 사용 가능
  • 정적 멤버
    • 정적 필드 : static 타입 필드 [=초기값];
    • 정적 메소드 : static 리턴 타입 메소드 (매개변수 선언, ...) { ... }
    • 정적메소드 선언시 객체 없어도 실행되므로 내부에 인스턴스 필드, 메소드 사용 불가 / this 불가
  • 싱글톤: 전체 프로그램에서 단 하나의 객체만 만들도록 보장
    • 클래스 외부에서 new연산자로 생성자 호출할 수 없도록 막아야함
    • 생성자에 private, 정적필드 하나 선언하고 자신의 객체 생성해 초기화, 정적 필드도 private 접근 제한자 붙임
package chap06;

public class Singleton {
	private static Singleton singleton = new Singleton();
	private Singleton() {}
	
	static Singleton getInstance() {
		return singleton;
	}

}
package chap06;

public class SingletonExample {
	public static void main(String[] args) {
		/*
		 * Singleton obj1 = new Singleton(); //컴파일 에러
		 * Singleton obj2 = new Singleton(); //컴파일 에러
		 * */
		
		 Singleton obj1 = Singleton.getInstance();
		 Singleton obj2 = Singleton.getInstance();

		 if(obj1 == obj2) {
			 System.out.println("같은 싱글톤 객체입니다.");
		 }else {
			 System.out.println("다른 싱글톤 객체입니다.");
		 }
	}
}
  • final 필드와 상수
    • final 은 초기값이 저장되면 이게 최종값이 되어 프로그램 실행 도중 수정불가
    • 상수는 불변의 값. 
      • final 필드도 변경할 수 없지만 상수는 아님. 불변의 값은 객체마다 저장할 필요가 없는 공용성을 띄며 여러 값으로 초기화 불가. 상수는 static이며 final이어야한다. static final필드는 객체마다 저장되지 않고 클래스에만 포함되며 한번 초기값이 저장되면 변경할 수 없다.
  • 접근 제한자
접근 제한 적용 대상 접근할 수 없는 클래스
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 자식 클래스가 아닌 다른 패키지에 소속된 클래스
default 클래스, 필드, 생성자, 메소드 다른 패키지에 소속된 클래스
private 필드, 생성자, 메소드 모든 외부 클래스

 

 

반응형
profile

보글보글 개발일지

@보글

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!