본문 바로가기

코딩공부일지/자바독학

[자바혼공] 객체지향 개념 / 클래스와 객체, 매서드, 오버로딩, 생성자, 초기화

  • 자료출처

생활코딩 by egoing - 자바: https://opentutorials.org/module/516
남궁석의 자바의정석: https://github.com/castello/javajungsuk_basic/
1.객체지향 언어
2. 클래스와 객체
- 클래스란: 객체를 정의해 놓은 것 / 객체의 설계도
- 클래스의 용도: 객체를 생성하는데 사용
- 객체: 실존하는 것, 사물 또는 개념
- 객체의 용도: 객체가 가지고 있는 속성과(변수) 기능(매서드)에 따라 다름
3. 객체의 구성요소 - 속성, 기능
- 속성 (변수): TV의 크기, 길이, 높이, 색상, 볼륨, 채널 등
- 기능: 켜기, 끄기, 볼륨높이기, 채널 변경하기 등
4. 객체와 인스턴스
- 인스턴스화: 클래스로부터 객체를 만드는 과정
- 인스턴스: 어떤 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 부름
5. 한 파일에 여러 클래스 작성하기
- 소스파일 내 public class가 있다면 소스파일의 이름은 반드시 public class와 일치해야 함
-소스파일 내 public class 가 없다면, 소스파일의 이름은 소스파일 내 어느 클래스의 이름으로도 생성가능
6. 객체의 생성과 사용

class obj_1 {
public static void main(String [] args){
  Tv t ;                                  // 클래스타입의 참조변수 t 선언
  t= new Tv();              // 연산자 new 에 의해 인스턴스(객체) t가 메모리의 빈 공간에 생성
                            // 객체의 멤버변수는 기본값으로 초기화
  t. channel = 7;           // 참조변수 t에 저장된 인스턴스(tv)의 멤버변수 channel에 7 저장
  t. channelDown();         // 참조변수 t가 참조하고 있는 인스턴스의 channelDown메소드 호출 
                            // 메소드는 멤버번수 channel 저장값을 1 감소시킴
  System.out.println (t.channel);
  }
}


class Tv {
   String color;
   boolean power;
   int channel;
   
   
   void power() {power=!power;}
   void channelUp() {++channel;}
   void channelDown() { --channel;}
   
   
 }
   
==> 인스턴스(객체)는 참조변수(리모콘)을 통해서만 다룰 수 있다.
    Tv타입 객체를 사용하려면 Tv타입의 참조변수가 필요하다. 
     (참조변수 타입 = 인스턴스 타입)


7. 객체배열 (참조변수 배열)

Tv tv1; tv2; tv3;
===> Tv [] tvArr = new Tv[3];
     Tv 타입의 참조변수 3개 생성

--------------------------------------------------------------------
배열 초기화 ( Tv 객체 3개에 참조변수 저장)

Tv [] tvArr = new Tv[3];
tvArr[0]= new Tv();
tvArr[1]= new Tv();
tvArr[2]= new Tv();

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


8. 클래스의 정의
1) 데이터 + 함수
2)사용자 정의 타입 (알듯 모르겠음)

9. 선언위치에 따른 변수의 종류
1) 인스턴스 변수 /클래스변수 /매서드변수

class Variables
{
int iv;
static int iv;

//인스턴스 변수
//클래스 변수
클래스 영역
void method()
{
int lv=0;
}

}
// 지역변수 메소드 영역
인스턴스 변수 클래스 영역에 선언
인스턴스를 생성할 때 만들어짐
인스턴스마다 별도의 저장공간(변수)을 가지므로 서로 다른 값을 가질 수 있음
인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스 변수로 선언

ex) 게임카드에서 카드의 무늬, 숫자, 폭, 높이 등
클래스 변수 클래스 영역에 선언
인스턴스 변수 앞에 static 붙여서 생성
모든 인스턴스가 공통된 저장공간 (변수)를 공유
클래스 내 모든 인스턴스가 공통값을 유지해야하는 속성의 경우, 클래스 변수로 선언

ex) 게임카드에서 카드의 가로길이, 세로길이 등
지역변수 메소드 내에서 선언하여 메소드 내부에서만 사용 가능
메소드 종료시 자동으로 소멸되며 사용불가하게 됨

2) 클래스 변수와 인스턴스 변수

Card c1= new Card();
c1.kind = "Heart";
c1.number = 7;


c1.witdth= 50;         => Card.width=50;
c1.height= 150;        => Card.height=150;
  // cv (클래스변수)는 클레스 이름으로 사용



class Card{
  String kind;
  int number;
  static int width = 100;
  static int height = 250;
}


10. 메서드
1) 메서드란?:
-특정 작업을 수행하는 일련의 문장을 하나로 묶은 것, 일정 값을 입력하면 해당 값으로 작업을 수행하여 결과 반환
-선언부, 구현부로 구성

int add (int a, int b)                     // 선언부

{                                           // 구현부 
    int result = a + b;
    return result;
    
 }

2) 메서드의 선언부

 반환타입,  메서드이름,  매개변수 선언으로 구성
 
     int      add        (int a, int b)

3) 매개변수 선언 (매개변수 => 함수의 정의역에 해당하는 부분)
- 필요한 값의 개수만큼 변수를 선언
-변수간 구분은 "," 사용
-매개변수간 타입이 같아도 타입을 생략할 수 없음
4)반환타입
-메소드의 반환타입이 없는 경우, "void"를 적어야 함

 void print99danAll () {
   for (int i=1; i<=9; i++) {
       for (int j=2; j<=9; j++) {
         System.out.print(j*i);
    }
       System.out.println();
       
}

5) 메서드의 구현부
(1) return문
- 메서드의 반환타입이 'void'가 아닌 경우, 구현부{} 내에 반드시 'return 반환값;' 포함
- 반환값 타입은 반환타입과 일치하거나 자동형변환이 가능한 값이여야 함
- return문은 단 하나의 값만 반환할 수 있음. 매개변수가 여러개여도 반환값은 하나만 허용
(2)지역변수
-매서드 내에 선언된 변수
-매서드 내 선언된 변수는 해당 매서드에서만 사용 가능. 서로 다른 메서드라면 변수 중복이 가능함
-매개변수도 메서드 내에 선언된 변수이므로 지역변수임

 int add ( int a, int b) {
        int result = a+b;
        return result;
  }
  
  
  int multibply ( int a, int b) {
          int result = a*b;
          return result;
          
  
  }

6) 메서드의 호출

메서드이름( 값1, 값2, 값3...) ;

print99danAll();                          // void print99danAll() 호출
int result = add (3, 5);                  // int add (int a, int b) 호출 후 결과를 result에 반환

7) 인수(인자/ argument )와 매개변수(parameter)
- 인수: 매서드 호출 시 () 의 지정값 (정의역에 대입한 값) (상단의 3,5)
-인수는 매서드 호출 시 매개변수에 대입, 인수 타입은 배개변수 타입과 일치 or 자동형변환이 가능해야 함
-매서드의 인자값에 매개변수 수보다 많은 수를 넣거나, 타입이 다른 값을 넣으면 에러 발생
8)매서드의 실행흐름
- 메서드영역

class Mymath {
   long add (long a, long b) {
     long result = a+b;
     return result;
   // return a+b; (위 두 줄을 한줄에)
   }
}

--------------------------------------
class Mymath {
     long add ( long a, long b) { return a+b;}
     long subtract ( long a, long b) { return a-b;}
     long multiply ( long a, long b) { return a*b;}

- 클래스영역

public static void main(String [] args) {
  Mymath mm = new Mymath();
  long value = mm.add(1L, 2L);
  
  System.out.println(value);
  
  }
Class ex6_4 {
public static void main(String[] args) {
  Mymath mm = new MyMath();
  long result1 = mm.add(5L, 3L);
  long result2 = mm.subtract(5L, 3L);
  long result3 = mm.multiply(5L, 3L);
  long result4 = mm.divide(5L, 3L);
  
  System.out.println(result1);
  System.out.println(result2);
  System.out.println(result3);
  System.out.println(result4);
  }
}

Class Mymath {
  long add (long a, long b){ return a+b; }
  long subtract (long a,long b){ return a-b;}
  long multiply (long a, long b){ return a*b;}
  double divide (double a, double b) { return a/b;}
  
}

11. return 문 / 반환값
1) return문: 현재 실행중인 메서드를 종료하고 호출한 메서드로 돌아감
-반환값 유무에 관계없이 모든 메서드는 하나의 return문을 가지고 있어야 함
-반환타입이 void인 경우, 메서드 마지막에 컴파일러가 "return;"을 자동으로 추가

 int max(int a, int b) {
   if (a> b) return a;
 }
 
 == > 에러발생, 조건식의 결과에 따라 return문이 실행되지 않을 수 있기 때문!
 
  int max(int a, int b) {
   if (a> b) 
      return a;
   else
      return b;
 }

2) 반환값

 int add ( int a, int b) {
        int result = a+b;
        return result;
  }
  
  
  int multibply ( int a, int b) {
          int result = a*b;
          return result;
          
  
  }

=> 위에서 a+b, a*b가 각각 반환값
12. 호출스텍

1. 메소드가 호출되면 수행에 필요한 만큼의 메모리를 스텍에서 할당받음
2. 메소드 수행을 마치면 사용한 메모리 반환, 스택 제거
3. 호출스텍의 제일 상단 메서드가 현재 실행 중 메소드
4. 그 바로 아래 메소드가 해당 메소드의 호출 메소드

13. 기본형 매개변수 / 참조형 매개변수**

 -매개변수 타입이 기본형(primitive type)일 때:
  1) 기본형의 값이 복사됨
  2) 변수의 값을 읽기만 할 수 있음 (read only)
-매개변수 타입이 참조형(reference type)일 때:
 1) 저장된 곳의 주소를 알 수 있음
  2) 변수의 값을 읽고 복사할 수 있음 (read and write)

1) 참조형 매개변수

class Data { int x; }

class Ex6_6 {
  public static void main(String[] args) {
    Data d = new Data ();
    d.x = 10;
    
    change(d.x);
    System.out.println(d.x);  // x=10
  }
 
  static void change (int x) {
    x= 1000;
    System.out.println(x);   // x=1000
    
}​

===> d.x의 값이 변경된 것이 아니라, change 메서드의 "매개변수 x"의 값이 변형된 것
원본이 아닌 복사본이 변경된 것으로, 원본 영향 없음
2) 기본형 매개변수

class Data2 { int x;}

class ex6_7 {
  public static void main(String[] args) {
    Data2 d = new Data2();
    d.x=10;
    System.out.println(d.x); // 10
    
    change(d);
    System.out.println(d.x); // 1000
    
  }
  
  static void change(Data2 d){
     d.x=1000;
     System.out.print(d.x); // 1000
     }
 }

===> change 매서드에서 매개변수를 참조형으로 선언, x의 값이 아닌 변수 d의 주소가 매개변수 d 에 복사,
main매서드의 참조변수 d와 change 매서드의 참조변수 d는 같은 곳을 가리키게 됨
14. 참조형 반환타입

class Data3 { int x;}

class ex6_8
  public static void main(String[] agrs){
    Data3 d= new data();
    d.x=10;
    
    Data3 d2 = copy (d);
    System.out.println(d.x)'
    System.out.println(d2.x);
    
 }
 
 
 static Data3 copy (Data3 d){
   Data3 tmp = new Data3();
   tmp.x= d.x;
   return tmp;
   }
 }

15. static 메서드, 인스턴스 메서드

static 매서드: 객체를 생성하지 않고 '클래스이름.매서드이름(매개변수)' 형식으로 호출 가능
--인스턴스와 관계없는 매서드 (인스턴스 변수 or 인스턴스 매서드를 사용하지 않는 매서드)
인스턴스 매서드: 객체를 생성해야지만 호출 가능
--인스턴스 변수와 관련된 작업을 하는, 매서드 작업에 있어서 인스턴스 변수를 필요로 하는 매서드임
인스턴스 변수는 객체(인스턴스)를 생성해야 만들어지므로, 인스턴스 매서드도 인스턴스를 생성해야 호출 가능

16. static을 언제 붙여야 할까?

1)클래스 설계 시, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 경우/모든 인스턴스에서 같은 값이 유지되어야 하는 경우
2) 클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용가능
-static이 붙은 변수는 클래스가 메모리에 올라갈 떄 자동으로 생성
3) 클래스 매서드는 인스턴스 변수 사용 불가
- 인스턴스변수는 인스턴스가 존재해야지만 사용가능
4) 작성한 메서드가 인스턴스 변수가 필요하지 않다면 static을 붙일 것. 메서드 호출시간이 짧아짐

17. 오버로딩
- 한 클래스 내에서 같은 이름의 메서드를 여러개 정의하는 것
-매서드 이름이 같아도 매개변수가 다르면 서로 구분될 수 있기 때문에 가능
-조건

1) 메서드 이름이 같음
2) 매개변수 개수 or 타입 불일치
3) 반환타입은 관계없음

상기 조건을 만족하지 못하는 경우 중복 정의로 간주, 컴파일 에러 발생

ex) println매서드

18. 생성자 - 모르겠다 다시보자
1) 생성자란?
- 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 매서드'
- 모든 클래스는 반드시 하나 이상의 생성자를 가져야 함
- 매서드와 유사하지만 리턴값이 없음

1) 생성자의 이름=클래스이름
2) 리턴 값 없음

2) 생성자 정의방법

클래스이름 (타입변수명) { }

Mymath (int) {}

=> 연산자 new가 인스턴스를 생성하는 것이지, 생성자가 인스턴스를 생성하는 것이 아님. 생성자는 초기화의 역할
3) 기본생성자
- 매개변수가 없는 생성자
- 생성자가 하나도 없을 시 컴파일러가 자동 추가

클래스이름() {}
Point() {}


-------------------------------------------------------------------------------------------------------