ssung_항해일지/항해99_언어학습(Java)

Java - 5일차(마지막)

ssungcohol 2023. 1. 27. 02:42

사실 오늘은 Java 기초의 마지막 part인 solid를 학습해야 하지만, 아직 부족한 나는 객체지향을 복습하고 넘어가기로 했다!


클래스와 객체

클래스란? - 객체를 정의한 것
(객체 자체는 아님)

클래스 용도 - 객체 생성
객체란? - 사물 또는 개념
객체의 용도 - 객체가 가지고 있는
기능과 속성에 따라 다름

객체의 구성요소

변수 (속성) String color;  // 색깔
boolean power;  // 전원상태
int channel;  //채널
메서드 (기능) void power() { power = !power; }
void channelUp() { channel++; }
void channelDown() { channel--; }

객체와 인스턴스

인스턴스화              
클래스  ---------------------------->  인스턴스(객체)

(클래스로부터 객체를 만드는 과정 = 인스턴스화, 클래스로부터 만들어진 객체 = 클래스의 인스턴스) ∴ (객체 = 인스턴스)

 

클래스가 왜 필요한가?
=> 객체를 생성하기 위해
객체는 왜 필요한가?
=> 객체를 사용하기 위해
객체를 사용한다는 것은?
=> 객체가 가진 속성과 기능을 사용

객체의 생성과 사용

Tv t;		// Tv 클래스 타입의 참조변수 t 선언
t = new Tv();	// Tv인스턴스(객체)를 생성 후, Tv인스턴스 주소를 t에 저장

// 위의 코드를 간단화하면

Tv t = new Tv();	// Tv 객체 생성, 변수타입 Tv와 객체이름 Tv를 꼭! 일치시켜줘야한다.
t.channel = 7;		// 객체 사용 (객체의 멤버 변수를 사용)
t.channelDown();	// 객체 사용 (객체의 멤버 메서드를 사용)

객체배열

 => 객체배열 == 참조변수 배열

Tv tv1, tv2, tv3; Tv [] tvArr = new Tv [3];
Tv [] tvArr = new Tv[3];	// 참조변수 배열 (객체배열) 생성 == Tv타입의 참조변수 X 3

// 객체를 생성하여 배열의 각 요소에 저장
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[0] = new Tv();

// 배열의 초기화 블럭을 사용하여 간단히 하면
Tv [] tvArr = { new Tv(), new Tv(), new Tv() };		// 배열의 초기화

선언위치에 따른 변수의 종류

 

class Variables {	// 클래스 영역 시작

    int iv;		// 인스턴스 변수 (iv)
    static cv;		// 클래스 변수 (cv)
    
    void method() {	// 메서드 영역 시작
    
    int lv = 0;		// 지역변수 (lv)
    
    }			// 메서드 종료
}			// 클래스 종료
변수의 종류 선언 위치 생성시기
클래스 변수 (cv) - 공통속성
(사람은 손과 발을 모두 가지고 있지)
클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수 (iv) - 개별속성
(하지만, 손과 발 크기는 모두 다르지)
인스턴스가 생성될 때 (객체 생성시)
지역변수 (lv) 클래스 영역 이외
(메서드 영역)
변수 선언문이 수행되었을 때

클래스 변수 - 인스턴스를 생성하지 않고, 언제라도 바로 사용 가능 == 객체를 생성하지 않아도 언제든지 사용 가능

인스턴스 변수 - 인스턴스를 생성해야지 사용 가능 == 객체 생성 후 사용 가능

지역변수 - 지역변수가 선언된 블럭 { } 내에서만 사용 가능, 블럭 { } 을 벗어나면 소멸~


메서드(method) - 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것

// 반환타입(int) 메서드 이름(add) 매개변수(int x, int y)
int add (int x, int y) {
	int result = x + y;
    
    return result;
}

메서드 호출

메서드 이름 (값1, 값2, ...)	// 메서드를 호출하는 방법
		//(값1, 값2, ...== 작업에 필요한 값들)
add();		// void add()를 호출

return문 - 반환타입이 void가 아닌 경우, 즉 반환값이 있는 경우, 반드시 return 문이 있어야한다!

 

void printGugudan (int dan) {
	for (int i = 1; i <= 9; i++) {
    	System.out.printf(%d * %d = %d%n, dan, i, dan * i);
        }
        return; // 반환타입이 void 이므로 생략 가능! but 반환타입이 void가 아닐 경우 생략 불가
}
int add (int x, int y) {  // 반환타입이 void가 아닌 int 타입
	int result = x + t;
    return result	// 반환타입이 int 이므로 return 문 작성 필수! // 반환타입과 결과값 타입일치 필수!
}

호출스택

public static void main(String[] args) {
	System.out.println("Hello!");
}

코드 호출스택 순서

    println (Hello!)    
  main main main  
  • 메서드가 호출되면 수행에 필요한 만큼 메모리를 스택에 할당받는다.
  • 메서드가 수행을 마치고나면 사용했던 메모리를 반환
  • 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.
  • 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

기본형 매개변수 - 변수의 값을 읽기만 할 수 있다. 

참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다.


static 메서드와 인스턴스 메서드

static 메서드(클래스 메서드)

  • 인스턴스 (객체)생성 없이 '클래스 이름. 메서드 이름()' 으로 호출가능
  • 인스턴스 멤버(인스턴스 변수, 인스턴스 메서드)와 관련 없는 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수 사용 불가 (클래스 메서드 호출 시 인스턴스(객체)가 존재하지 않을 수도 있기 때문)

인스턴스 메서드

  • 인스턴스를 생성한 후, '참조변수.메서드이름()' 으로 호출
  • 인스턴스 멤버 (인스턴스 변수, 인스턴스 메서드)와 관련된 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수 (iv) 사용 가능
class TestClass2 {
	int iv;		// 인스턴스 변수 => 객체(인스턴스) 생성 후 사용 가능
    static int cv;		// 클래스 변수 => 언제든지 사용 가능
    
void instanceMethod(int iv) {		// 인스턴스 메서드 => 객체 생성 후 호출 가능
    	System.out.println(iv);		// 인스턴스 변수(iv) 사용 가능
        System.out.println(cv);		// 클래스 변수(cv) 사용 가능
    }
    
    static void staticMethod() {	// static 메서드 => 객체 생성없이 사용 가능(iv 사용 불가)
    	System.out.println(iv);		// Error! 인스턴스 변수 (iv) 사용 불가
        System.out.println(cv);		// 클래스 변수는 사용 가능
    }
}

오버로딩 (overloding)

- 한 클래스 내에 같은 이름의 메서드를 여러 개 정의한 것!

오버로딩 성립조건

  • 메서드의 이름이 같아야한다.
  • 매개변수의 개수 또는 타입이 달라야한다.
  • 반환 타입은 관계없다.
int add (int a, int b) { return a + b; }  // 중복정의
int add (int x, int y) { return x + y; }

int add (int a, int b) { return a + b; }  // 중복정의
long add (long a, long b) { return (long)a + b; }

long add (int a, long b) { return a + b;}  // 오버로딩 성립
long add (long a, int b) { return a + b;}  // 매개변수 타입에 의해 호출 메서드 구분 가능!!

생성자 - 인스턴스가 호출될 때 생성되는 인스턴스 ( = 객체 = iv 묶음) 초기화 메서드이다!

  • 생성자의 이름은 클래스의 이름과 같아야한다.
  • 생성자는 리턴 값이 없다.
  • 모든 클래스는 반드시 생성자를 가져야한다!

기본 생성자 - 매개변수도 없고 아무런 내용도 없는 생성자
( 클래스이름 ( ) { }  =>  point ( ) { } )

 

매개변수가 있는 생성자

Car c = new Car ( );
c.color = "white";
c.gearytpe = "auto";
c.door = 4;
Car c = new Car ( "white", "auto", 4);

this - 인스턴스(객체) 자신을 가리키는 참조변수

  • 인스턴스 메서드(생성자 포함) 에서 사용 가능
  • 지역변수와 인스턴스 변수를 구별할 때 사용
  • 인스턴스 멤버만이 this를 사용할 수 있다.

this () - 생성자에서 다른 생성자를 호출할 때 사용

  • 생성자의 이름으로 클래스이름 대신 this를 사용
  • 반드시 첫 줄에서만 호출이 가능

변수의 초기화 - 변수를 선언하고 처음으로 값을 저장하는 것

  • 선언과 동시에 적절한 값으로 초기화 하는 것이 좋다
  • 멤버변수는 초기화를 하지 않아도 자동으로 변수의 자료형에 맞게 기본값으로 초기화 된다. (선택사항)
    • 클래스 변수 : 클래스가 처음 로딩될 때 단 한번만 초기화
    • 인스턴스 변수 : 인스턴스(객체)가 생성될 때 마다 초기화
  • 지역변수는 사용 전에 반드시! 수동으로 초기화해야 한다. (필수사항)

 


초기화 방법

명시적 초기화 ( = ) : 선언과 동시에 초기화를 하는 것

clss Car {
	int door = 4;	// 기본형 변수 초기화
	Engine 3 = new Engine();	// 참조형 변수 초기화
}

초기화 블럭 ( { } )

  • 클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용
  • 인스턴스 초기화 블럭 : 인스턴스 변수의 복잡한 초기화에 사용
728x90