[개인공부] ch6~

Walter Mitty·2022년 11월 2일
0

개인공부

목록 보기
6/40
post-thumbnail

객체지향 언어

장점

  • 코드 재사용성이 높다
  • 유지보수가 용이하다
  • 중복 코드 제거

특징

  • OOP(Object-Oriented-Programming) - 캡상추다!
    • 캡슐화
    • 상속
    • 추상화
    • 다형성

클래스

  • 정의: 클래스란 객체를 정의해 놓은 것
  • 용도: 클래스는 객체를 생성하는데 사용


  • 객체 = 속성(변수) + 기능(메서드)

    • 정의: 실제로 존재하는 것. 사물 또는 개념
    • 용도: 객체가 가지고 있는 기능과 속성에 따라 다름
    • 모든 인스턴스를 대표하는 일반적 용어
      • 객체 = 인스턴스: 특정 클래스로부터 생성된 객체(예: Tv인스턴스)

객체 배열

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

    Tv 타입의 참조변수 tv1, tv2, tv3가 있을 때 Tv타입 참조변수 x 3이 된다.

이렇게도 표현 가능하다

Tv[] tvArr = { new Tv(), new Tv(), new Tv()};

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


메서드

  • {문장들}을 묶어 놓은 것.
  • 필요한 값(입력)을 받아서 처리하고, 결과를 반환(출력).

메서드의 장점

  • 코드 중복 줄일 수 있음
  • 코드 관리가 쉬움 (한곳에서 관리?하니까)
  • 코드 재사용 가능
  • 코드가 간결해서 이해하기 쉬워짐

메서드 작성

  • 반복적으로 수행되는 여러 문장을 메서드로 작성
  • 하나의 메서드는 한가지 기능만 수행하도록 작성(하는게 좋다)
    • 그래야 재사용성이 좋아진다!
  • 메서드 = 선언부 + 구현부
반환타입 메서드이름 (타입 변수명, 타입 변수명, ...) {
//메서드 호출시 수행될 코드
}
  • 지역변수(lv) : 메서드 내에 선언된 변수 (메서드 영역에!) + 메서드에 쓰이는 파라미터도 지역변수다.

  • 사칙연산 키워드
    • 더하기 sum
    • 빼기 substract
    • 곱하기 multiply
    • 나누기 divide

return 문

  • 반환타입이 void가 아닌 경우, 반드시 return문이 필요하다.
  • 반환값은 반환타입과 일치해야하고, 다르다면 자동형변환이 가능해야한다.

호출 스택(call stack)

  • 스택: 밑이 막힌 상자와 같아서, 위로 차곡차곡 쌓인다.
    • 꺼낼 때도 위에서부터 꺼낼 수 있고, 중간에 뭘 끼우거나 중간에 있는걸 뺄 수 없다.
  • 메서드 수행에 필요한 메모리가 제공되는 공간
  • 메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제
    • main 메서드가 실행이되고 println이 호출이되어 실행되면 main메서드는 대기 상태가 된다.
    • println()이 종료되면 stack 메모리에서 사라지고 다시 호출한 곳=main으로 돌아가 대기 상태이던 main 메서드가 실행이된다.

따라서 아래 있는 main 메서드가 위의 println()메서드를 호출 → 맨 위의 메서드 하나만 실행 중, 나머지는 대기 중으로 변한다.


기본형 매개변수 6-23 * 반복학습하기

  • 기본형 매개변수: 변수의 값을 읽기만 가능(read only)

참조형 매개변수 6-24,25 * 반복학습하기

  • 참조형 매개변수: 변수의 값을 읽고 변경할 수 있다(read & write)
  • 메서드에서 객체의 주소를 반환한다=객체를 반환한다

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

  • 인스턴스 메서드
    • 인스턴스 생성 후, 참조변수,메서드이름() 으로 호출
    • 인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드
      • iv: instace variable (멤버변수)
      • im: instance method
    • 메서드 내에서 인스턴스 변수(iv) 사용가능

생각해보면, im은 iv를 사용한 메서드인데 인스턴스 생성을 안하면 당연히게도 iv를 사용못한다.

▲ iv를 사용여부에 따라 갈림 ▼

  • static 메서드

    • 객체 생성없이 호출가능(iv 필요없으니까)
      • 클래스이름.메서드이름()
        예) Math.random() → Math라는 클래스의 static 메서드.
      • 객체생성을 안하니까 참조변수를 쓸수가 없다.
    • 인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드
    • 메서드 내에서 인스턴스 변수(iv) 사용불가
    • 속성(멤버 변수) 중에서 공통 속성에 static을 붙인다.
    • 언제나 호출가능

    6-27)
    따라서, 언제 static 메서드를 붙이고 안붙이느냐를 결정하는건 인스턴스 멤버를 관련없는 작업을 하면 static 을 붙여준다.


이것처럼 static 메서드의 파라미터는 로컬변수고 인스턴스 변수가 아니다!
-그럼 static 메서드는 무조건 파라미터가 필요한건가?


메서드 간의 호출과 참조

  • static 메서드는 인스턴스 변수(iv)를 사용할 수 없다.
class TestClass2 {
	int iv;			// 인스턴스 변수 // 객체 생성 후 사용가능.
    static int cv;	// 클래스 변수 // 언제나 사용 가능.
    
    void instanceMethod() {		// 인스턴스 메서드 // 객체 생성 후 호출가능.
    	System.out.println(iv);	// 인스턴스 변수를 사용할 수 있다.
        System.out.println(cv);	// 클래스 변수를 사용할 수 있다.
    }
    
    static void staticMethod() {	// static 메서드
   		System.out.println(iv);		// Error!!! 인스턴스 변수를 사용할 수 없다.
        System.out.println(cv);		// 클래스 변수를 사용할 수 있다.
    }
} // end of class
  • static 메서드는 인스턴스 메서드(im)를 호출할 수 없다.
class TestClass{
	void instanceMethod() {}		// 인스턴스메서드
    static void staticMethod() {}	// static 메서드
    
    void instanceMethod2() {		// 인스턴스메서드
    	instanceMethod();			// 다른 인스턴스메서드를 호출한다.
        staticMethod();				// static메서드를 호출한다.
    }
    
    static void staticMethod2() {	// static 메서드
    	instanceMethod();			// Error!! 인스턴스메서드를 호출할 수 없다. // iv로 작업을 하는 메서드고, 객체가 필요하므로.
        staticMethod();				// static메서드는 호출할 수 있다.
    }
} end of class

Q&A

Q. static 메서드는 static 메서드를 호출 가능한가요?
A. 네.

Q. static 메서드는 인스턴스 변수 사용 가능한가요?
A. 아니요!!!

Q. static 메서드는 인스턴스 메서드 사용 가능한가요?
A. 아니요!!!!!!!!!

Q. 왜 static 메서드는 인스턴스 멤버(iv, im)를 쓸 수 없나요?
A. static 메서드를 호출했을 때 객체(iv묶음)가 없을 수도 있기 때문입니다.

0개의 댓글