혼공단/혼공자

혼공자 - 3주차

珠延 2024. 1. 21. 18:40

기본 미션 및 선택 미션 인증

 

✨ Chap 6 -1 객체 지향 프로그래밍

객체

- 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것
- 객체에는 속성(필드)과 필드(동작)으로 구성됨
- 객체 모델링 : 현실 세계의 객체를 소프트웨어 객체로 설계하는 것

 

객체의 상호작용

- 객체들은 각각 독립적으로 존재하고, 다른 객체와 서로 상호작용 하면서 동작한다.
- 객체들 사이의 상호작용 수단은 메소드이다. 
- 이때 객체가 다른 객체의 기능을 이용하는 것이 메소드 호출이다.

 

메소드 호출

리턴 값 = 전자계산기객체.메소드(매개값1, 매개값2, ...);
int result = Calculator.add(10,20);
// 리턴 값을 통해서 데이터를 주고 받음

객체와 클래스

객체를 생성하기

  • 클래스 : 설계도
  • new 연산자 : 클래스를 객체로 만들어줌
  • 인스턴스 : 클래스로부터 만들어진 객체
  • 인스턴스화 : 클래스를 new 연산자를 통해 객체로 만드는 과정

 new 연산자

클래스 변수 = new 클래스(); //클래스 변수 선언과 객체 생성
Student s1 = new Student();


- new 연산자 뒤에는 생성자가 오는데, 생성자는 클래스() 형태를 가지고 있다.
- new 연산자를 사용한 만큼 객체가 메모리 heap영역에 생성된다.

 

개발자 → 설계 → 클래스(설계도) → 인스턴스화(new 생성) → 인스턴스 (객체)
- 설계도는 클래스로, 클래스로 만든 객체는 인스턴스

 


클래스의 두 가지 용도

  • 라이브러리 클래스 : 라이브러리 클래스는 다른 클래스에서 이용할 목적으로 설계된다. (필드, 생성자, 메소드)
  • 실행 클래스 : main() 메소드 제공(실행하기 위한 코드)

 

클래스의 구성 멤버

필드(Field) 객체의 데이터가 저장되는 곳 
생성자와 메소드 전체에서 사용,
객체가 소멸되지 않는 한 객체와 함께 존재
생성자 객체 생성 시 초기화 역할 담당
클래스 이름으로 돼 있고, 리턴 타입이 없다
메소드 객체의 동작에 해당하는 실행 블록

 

다음은 클래스의 구성 멤버에 대해서 자세히 알아보도록 하겠습니다!


✨ Chap 6 -2 필드

필드

  • 객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳이다.

필드 선언

타입 필드 [ = 초기값 ] ;
String company = "현대자동차";
int maxSpeed = 300;
int currentSpeed; //초기값이 저장 되지 않아도 객체 생성 시 자동으로 기본 초기값으로 설정됨

필드 사용

  • 클래스 내부의 생성자와 메소드에서 바로 사용이 가능하다
  • 클래스 외부에서 사용할 경우 클래스로부터 객체를 생성한 뒤 필드를 사용해야된다
//클래스 외부에서 필드 값 사용하기
Car myCar = new Car(); //객체 생성
myCar.company = "기아자동차"; //필드 값 변경

 


✨ Chap 6 -3 생성자

생성자

  • 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.
  • 객체 초기화 : 필드를 초기화, 메소드를 호출해서 객체를 사용할 준비를 하는 것

기본 생성자

  • 클래스 내부에 생성자 선언을 생략했다면 컴파일러가 기본 생성자를 자동으로 추가해준다.
  • 클래스에 선언한 생성자가 1개라도 있으면 컴파일러가 기본 생성자를 추가하지 않는다

생성자 선언

  • 리턴 타입이 없고 클래스 이름과 동일하다
  • 매개 변수 선언은 생략할 수도 있고 여러 개를 선언 가능 또한 new 연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할을 한다.
public class Car{
	//생성자
	Car(String model, String color, int maxSpeed){...}
}
public class CarExampe{
	public static void main(STring[] args){
    	Car myCar = new Car("검정", 3000);
        //Car myCar = new Car(); (x) -> 클래스에서 이미 생성자를 선언했으므로 기본 생성자를 호출할 수 없다
    }
}

 
 

필드 초기화

 

this.

  •  필드와 매개 변수의 이름이 동일할 때는 필드 앞에 this.을 붙여줌(구분)
public Korean(String name, String ssn ){
this.name = name;
this.ssn = ssn;
}

 

생성자 오버로딩

  • 매개 변수를 달리하는 생성자를 여러 개 선언하는 것
  • 매개 변수의 타입, 개수, 순서를 각각 다르게 선언해야 된다

다른 생성자 호출: this()

  • 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있다.
  • 이 경우 필드 초기화 내용은 한 생성자에게만 집중적으로 작성하고 
  • 나머지 생성자는 초기화 내용을 가지고 있게 한다.

 


✨ Chap 6-4 메소드

  • 메소드 선언은 선언부(리턴 타입, 메소드 이름, 매개 변수 선언)와 실행 블록으로 구성됨

리턴 타입 

  • 메소드가 리턴하는 결과의 타입을 표시한다
  • 리턴 타입이 없으면 void로 지정
  • 리턴 타입이 있으면 리턴값의 타입을 작성

 

메소드 이름

  • 숫자로 시작하면 안 되고 , $와 _를 제외한 특수 문자를 사용하지 말아야 한다.
  • 관례적으로 메소드 이름은 소문자로 작성
  • 뒤이어 오는 단어의 첫 글자는 대문자로 작성한다.
  • 메소드가 어떤 기능을 수행하는지 알 수 있도록 기능 이름으로 지어주는 것이 좋다!

매개 변수 선언

  • 메소드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용된다.

메소드 오버로딩

클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
매개값을 다양하게 받아 처리할 수 있도록 한다.
매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다.
int plus(int x, int y){
	int result = x-y;
    return result;
}

double plus(double x, double y){
	double result = x+y;
    return result;
}

✨ Chap 6-5 인스턴스 멤버와 정적 멤버

 인스턴스 멤버

  • 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드
  • 인스턴스 필드와 메소드는 객체에 소속돼 있으므로 객체 없이는 사용할 수 없다
public class Car{
	//필드
    int gas;
    //메소드
    void setSpeed (int speed){...} //int spped 필드를 사용했으므로 메소드는 인스턴스 멤버다
}

 

정적 멤버

  • 클래스에 고정된 멤버
  • 객체를 생성하지 않고 사용할 수 있는 필드와 메소드다.
  • 필드와 메소드 선언 시 static 키워드를 추가적으로 붙인다.
  • 정적 메소드 선언시 내부에 인스턴스 필드나, 인스턴스 메소드를 사용할 수 없다.
  • this. 키워드도 사용이 불가능하다.

정적 멤버 선언

public class Calculator{
	String color;
    static double pi = 3.141592; //고정
}

 
정적 멤버 사용

public class Calculator{
	static double pi = 3.141592;
    static int plus(int x, int y) {...}
    static int minus(int x, int y) {...}
}

double result1 = 10*1-*Calculator.pi;
int result2 = Calculator.plus(10,5);
int result3 = Calculator.minus(10,5);

 


final 필드

  • 초기값이 저장되면 실행 도중에 수정할 수 없다는 것이다.
  • final 타입 필드 [= 초기값];

상수

  • 불변의 값(static final)
  • 원주율 파이나 지구의 무게 및 둘레를 구할 때 사용
  • static이면서 final이어야 한다 (클래스에만 존재)
public class EArth{
	static final double EARTH_RADIUS = 6400;
    static fianl double EARTH_AREA = 4*Math.PI * EARTH+RADIUS * EARTH+RADIUS;
}

publid class EarthExample{
	public static void main(STring[] args){
    	System.out.println("지구의 반지름 : "+ Earth.EARTH_RADIUS + "km");
        System.out.println("지구의 표면적 : "+ Earth.EARTH_AREA + "km^2");
    }
}

 

✨ Chap 6-6 접근 제한자

접근 제한 적용 대상 접근할 수 없는 클래스
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 자식 클래스가 아닌 다른 패키지에 소속된 클래스
default 클래스, 펠드, 생성자, 메소드 다른 패키지에 소속된 클래스
private 필드, 생성자, 메소드 모든 외부 클래스