본문 바로가기

수업 정리

8일차 수업 정리(Class, 변수, Method)

Tip!
1. main class에서는 실행만 할수 있도록 제작
2. static 변수(공유)와 static 메소드(메소드 자체가 공유하는 역할)는 역할이 다르다.
3. 클래스를 만드는 방법과 인스턴스를 만드는 방법은 중요

** 클래스
1. Class
    => 관련있는 속성(변수 - property)과 메소드를 모아놓은 사용자 정의 자료형(개발자가 만드는 자료형)
    => 프로그래밍 언어나 프레임워크 제작 회사에서 제공하는 클래스
         -> API(Application Programming Interface)나 SDK(Software Development Kit)
    => 사용자가 제작하는 클래스
    => 다른 개발자가 만든 클래스 - 3rd party

2. Class 생성
    => 형식 : 접근지정자 + Class + 이름 + extends 상위클래스 명 + implements + 인터페이스명 나열
                  { 속성 , 생성자, 메소드 }

3. 객체 지향 프로그래밍(Object Oriented Programming)
    => 관련있는 속성이나 메소드를 클래스로 만들고 이 클래스를 이용하여 인스턴스를 만들어 사용하는 프로그램
    => 최근의 프로그래밍 언어는 객체지향 + 함수형 프로그래밍을 같이 지원

        (Java는 함수형 프로그래밍 지원 X, 람다를 이용하여 함수형 프로그래밍과 유사한 방식을 제공)
  1) 객체 지향 특징
    => Encapsulation(캡슐화) - 클래스를 만드는 방법
    => Ingeritance(상속)
    => Polymorphism(다형성) - 동일 메시지가 다르게 반응(동일한 코드가 호출 객체에 따라 다른 메소드 호출)
         ex) 마우스(사용하는 위치에 따라 다른 동작을 함)
  2) 객체지향 장점
    => 재사용성이 증가
    => 신뢰성 높은 프로그래밍을 할 수 있음

4. Class와 Instance
    => Class : 모형  /  Instance : Class를 기반으로 메모리를 할당받은 것
    => Object(객체) : 사용가능한 모든 것
         ex) int a = 10;  //a는 객체 - 클래스가 아닌것으로 생성
              Integer a = 10;  //a는 객체이고 인스턴스 - 클래스를 이용하여 생성

5. 인스턴스 생성
    => new 생성자( ); //생성자 - 클래스를 기반으로 메모리를 할당하고 메모리의 참조를 리턴
         Class명 변수명 = new 생성자(매개변수);  //인스턴스를 만드록 그 참조를 변수에 대입
         ex) Scanner sc = new Scanner(System.in);

6. 명명법
    => Class명의 첫글자는 대문자, 나머지는 소문자(단어 조합시 각 단어의 첫글자는 대문자, 약자의 경우 대문자의 연속
    => Class의 구성요소중 속성과 메소드는 소문자로 시작하는 것을 권장

7. 접근 지정자 : Class종류 + class + class명 + extends + 상위Class명 + implements 인터페이스 나열
    => 접근 지정자 : private, protect, package(default), public : class의 사용범위 지정
    => class 종류 : abstract, final, static, 생략
    => class와 class명은 생략 불가
    => extends : 상속 받기 위해 사용(Java는 단일 상속만 지원)
         상위클래스는 1개만 존재하고, 생략시 object class로 부터 상속 받은 것
    => Implements : 인터페이스를 구현하기 위해 사용, 생략 가능하고 여러개의 인터페이스 구현가능
 
8. Java 파일 규칙
    => 일반적으로 하나의 파일에 하나의 클래스를 생성
    => 파일이름은 class명.java이어야 함
    => 1개 파일에 여러개의 클래스를 생성가능, 이때 public 접근 지정자를 가진 클래스는 1개이어야하고 

         public 클래스가 있으면 이 클래스명으로 파일 이름을 설정
         안드로이드에서 하나의 파일에 여러개의 클래스를 만드는 경우가 종종 있음

9. main 메소드를 소유한 클래스
    => Java Application은 Main 메소드를 소유한 클래스만 실행이 가능
    => 실행시 java class명으로 실행
         IDE에서는 main 메소드를 소유한 클래스를 선택하고 Run메뉴를 실행하는 것이 java class명을 대신함

**Variable(변수)
1. 변수의 종류
  1) Local Variable(지역변수)
    => 메소드(이름(매개변수){ }) 안에서 만들어진 변수
    => 생성된 영역({ }으로 만들어진 것)에서만 사용이 가능
         (제어문, 예외처리 구문에서 만들어진 변수는 자신의 영역을 벗어나면 소멸 - 타영역에서 재선언 가능)
    => 지역변수는 자동 초기화 X, 값을 대입하고 사용해야 함
  2) Instance Variable(인스턴스 변수 - member Variable, field 또는 attribute, property 라고도 함)
    => Class 내부, 메소드 밖에 static이라는 키워드없이 선언된 변수
    => class 내부에 만들지만 실제 소유는 인스턴스, 각각의 인스턴스 만다 별도로 생성
    => 인스턴스 고유의 데이터를 저장할 목적으로 생성
    => 자동으로 초기화( 숫자 Data = 0, boolean Data = false, 나머지 = null)
  3) Static Variable(클래스변수, 정적 변수, 전역 변수)
    => class 내부, 메소드 외부에 static이라는 키워드와 함께 선언된 변수
    => class 내부에 1개만 만들어지는 변수
    => 인스턴스들이 데이터를 공유(통신) 할 목적으로 생성
    => 자동으로 초기화( 숫자 Data = 0, boolean Data = false, 나머지 = null)
  4) 변수의 다른 분류
    => 객체지향 언어는 위 3개로 변수를 구분, 종종 LocalVariable(지역변수), Global Variable(전역변수)로 구분하기도함
         (Global Variable : 모든 곳에서 사용한 변수, 공유가 목적)
    => 객체지향 언어에는 static 변수를 만들거나 singleton 패턴의 클래스를 디자인해서 Gloval Variable을 만듬

2. 인스턴스 변수 - 최근에는 property라고 많이 부름
    => class 내부, 메소드 외부에 static 키워드 없이 생성
    => 인스턴스가 각각 소유
    => 자동으로 초기화
  1) 만드는 방법 : 접근지정자 + 특성 + 자료형 + 변수명 = 값;
  2) 접근 지정자
    => pirvate : class 내에서만 접근 가능 - 인스턴스 사용 불가
    => package(default - 생략) : 같은 package에서는 public, 다를경우 private
    => protected : 같은 패키지 안에서 사용이 가능, 타 패키지에서도 상속받은 경우 하위클래스에서 사용가능

                       (타 패키지인 경우 인스턴스 사용 불가
    => public : class 내에서 사용가능, 인스턴스도 사용가능
  3) 특성
    => transient : serialization(직렬화 - 파일, 통신시 한번에 전송 가능하도록 하는 것)에서 제외 
    => volatile : 스레드에서 작업시 원본 데이터 전체를 가지고 작업하도록 해주는 예약어
  4) 선언과 동시에 값을 대입하는 경우는 드뭄(int a = 10;)
    => 객체 지향 언어에서는 생성자(Constructor)를 제공하기 때문에 생성자에서 초기화 를 권장
         (생성자 : 인스턴스 변수의 초기화를 목적으로 제공)
  5) 접근
    => class 내의 메소드에서는 이름만 사용해도 되고, 동일한 이름이 있는 경우 this.변수명으로 접근
    => class 외부에서 인스턴스를 이용해서 접근시, 인스턴스명.변수명으로 접근

3. 실습
    => 번호, 이름, 점수(국어, 수학, 영어)를 저장할 클래스를 만들고, 이 클래스 기반 인스턴스를 만들어서 데이터 저장

4. static변수 - 클래스 변수라고도 함
    => class 내부, 메소드 외부에 static이라는 키워드를 자료형 앞에 추가해서 선언한 변수
    => class 내부에 1개만 만들어짐
    => 자동으로 초기화
    => 인스턴스들이 데이터를 공유할 목적으로 제작
    => 이 변수는 외부에서 접근시 class명.변수명으로 접근
         (Java에서는 인스턴스명.변수명으로 접근 가능, but 경고 발생

5. final 변수
    => 변수를 상수화(읽기 전용 - 수정불가(method영역에 생성)) 
    => 이름은 모두 대문자로 하는 것이 일반적
    => 클래스 내에서 옵션을 만드는데 사용됨
    => 나중에 값을 변경할 수 없으므로 생성시 값을 대입해야함

**method
    => 전달받은 매개변수를 처리해서 결과를 돌려주는 작은 프로그램
    => 함수(function)라고도 하는데, 클래스 안에 존재하는 함수를 메소드라고 함
          (java는 모든 것이 클래스 내부에 만들어지므로 함수 표현 X)
    => 함수는 호출 되면 자신의 메모리 영역을 별도로 생성하여 독자적으로 수행
         (해당 영역이 stack구조로 만들어지기 때문에 stack이라 불리기도 함)
          Stack : Last In First Out(LIFO)구조 - 마지막 삽입된 것이 먼저 출력되는 자료구조
1. 생성
    => 형식 : 접근지정자 + 특성 + 결과형 + 메소드명(매개변수){ 메소드 내용; return 데이터; }
    => 접근 지정자는 변수와 동일
    => 특성
         - abstract(추상) : 내용이 없는 메소드
         - final(종단) : 재정의 할 수 없는 메소드
         - static : 클래스를 이용하여 호출
         - synchronized(동기화) : 실행중 다른 스레드에게 제어권을 넘기지 않는 메소드
         - native : 운영체제의 기능을 사용하기 위한 메소드로 대부분의 경우 C언어로 작성된 메소드를 호출할때 사용
    => 결과형은 return 할때 사용한 Data의 자료형을, 없을 경우 void로 설정
    => 매개변수는 메소드를 호출할 때 넘겨주는 Data로 없으면 생략 가능(여러개 사용 가능)
    => return 은 메소드의 내용을 수행하고 호출한 곳으로 되돌아가는 명령어(return or return + data 가능)
    => return 다음에는 어떠한 문장도 실행 불가

2. 메소드 호출
    => 클래스 내부에서 호출 : 메소드명(매개변수)
    => 클래스 외부에서 호출 : 클래스명.메소드명(매개변수) or 인스턴스명.메소드명(매개변수)

3. 메소드를 사용하는 이유
    => 중복된 code를 최소화
    => 프로그램을 작게 분할하여 유지보수를 편리하게 하기 위해

4. argument(매개변수)
    => 매소드 호출시 전달해주어야 하는 데이터를 argument라고 하는데, 메소드 내부에서는 parameter라고도 함
    => 없거나, 여러개 사용가능
    => 매개변수는 메소드 내에서만 사용 가능한 지역변수
    => 메소드 호출시 데이터를 전달하면 데이터가 저장중인 참조가 전달

5. return
    => 메소드의 수행을 중단하고 메소드를 호출한 곳으로 제어권을 넘겨주는 명령어
    => return시, return만 할 수도 있고 데이터를 가지고 return도 가능
    => return 할 데이터가 없는 경우 결과형을 void라고 해야 함(return 생략 가능 - 코드를 끝까지 수행)
    => return 할 데이터가 있으면 데이터의 자료형을 결과형에 기재
    => return을 하지 않으면 함수의 내용을 수행하고 종료, return 시 return된 Data를 다른 곳에서 사용 가능

6. this 
    => 메소드는 인스턴스가 각각 소유하지 않고, 클래스가 가지고 인스턴스의 클래스에서 찾아서 수행
    => 인스턴스 메소드에 숨겨진 첫번째 매개변수
    => 인스턴스를 이용하여 메소드를 호출 할때 인스턴스의 참조가 this에 자동 대입
    => 인스턴스 메소드 내에서 지역변수가 아닌 변수를 사용하면 앞에 자동으로 추가
    => 인스턴스 메소드 내에서 명시적으로 자신의 변수나 메소드를 호출하고자 할 때 this. 을 가지고 호출
    => 인스턴스 변수와 지역변수의 이름이 같은 경우, 인스턴스변수를 호출하려면 this.을 붙여서 호출

7. 접근자 메소드
    => 객체 지향 프로그래밍에서는 인스턴스가 인스턴스 변수에 직접 접근하는 것을 권장하지 않음
    => 변수는 private로 만든 후, 메소드를 이용하여 접근하는 것을 권장
    => 변수의 데이터를 리턴하는 메소드 : getter, 변수의 데이터를 설정하는 메소드 : setter
          (변수를 만들고 getter, setter를 가지면 property라고 함)
  1) getter : 인스턴스 변수의 값을 리턴
    => 리턴 타입은 변수와 동일한 자료형, 이름은 get변수명으로 하고, 변수명의 첫글자는 대문자
         매개변수 X, 메소드의 내용을 리턴
         ex) private int num;  
              public int getNum(){  return num;  }   //num의 getter 메소드
    => 변수의 자료형이 boolean인 경우 get 대신 is를 사용
          ex) private boolean alpha;
               public boolean isAlpha(){  return alpha  }  //num의 getter 메소드
    => 변수 없이, get 메소드를 만드는 경우 : 연산 프로퍼티로 계산을 수행하고 결과를 넘겨주는 프로포티
    => 시작점의 좌표 : x, y / 크기 : width, height / 중앙점의 좌표 center는 저장 없이 연산하여 리턴
         이런경우 center라는 변수를 만들지 않고 getCenter()만 만들어서 사용
  2) setter : 변수의 값을 설정하는 메소드
    => 리턴 타입 : void, 이름 : set변수명, 매개변수가 1개이상이고, 매개변수와 변수의 자료형은 같아야 함
    => 메소드의 내용은 매개변수의 값을 인스턴스 변수에 대입
         ex) private int num;
              public void setNum(int num){ 
              //willSet - 유효성 검사
              this.num = num;
              //didSet - 로그(작업내역 - 변경이력)기록 }
    => setter의 경우 대입하는 코드 앞, 뒤에 내용을 추가하는 경우가 종종 있음
         대입하기전 유효성 검사를 통해 대입해도 되는지 확인하는 코드를 수행
         대입 후, 변경 내용을 기록하는 코드를 수행
  3) 접근자 메소드는 대부분의 IDE에서 자동 생성하는 기능을 제공
  4) 최근 Java에서는 IDE가 아닌 lombok 라이브러리를 이용하여 생성(Spring - 어노테이션(유효성 검사까지 자동 주입)

8. static 메소드
    => 메소드의 결과형 앞에 static을 추가한 메소드
    => 클래스의 이름으로 호출이 가능(static이 없는 메소드는 인스턴스 이름으로만 호출 가능)
    => 메소드 안에서 지역 변수와 static변수만 사용 가능(메소드 내부에서 인스턴스 변수 사용 불가 - this 생성 X)
    => static 변수의 초기화나 인스턴스 변수를 사용하지 않는 메소드를 만들 때 이용

** 메소드 원형
    => 형식 : 리턴타입 + 메소드명(매개변수)
1. static 유무 확인
    => static이 아닌 것을 사용할 경우 인스턴스 생성 후, 인스턴스를 이용하여 호출
    => static일 경우 클래스명을 이용하여 호출

2. 매개변수를 확인
    => 매개변수를 확인하여 매개변수의 자료형과 일치하는 데이터를 대입
    => 갯수도 맞춰서 호출

3. 리턴타입을 확인
    => void 이면 호출하는 것으로 종료
    => void가 아닐경우 다른 작업을 연속으로 진행 or 변수에 결과를 대입하여 사용

** 알고리즘 문제
1. 년, 월, 일을 입력받아서 무슨 요일인지 출력
    => 입력받은 년도 이전까지의 날짜의 합을 계산
    => 입력받은 월 이전까지의 날짜의 합을 계산
    => 1을 더해서 7로 나눈 나머지를 확인
    => 윤년 계산(4의배수이고 100의 배수는 아닌경우 또는 400의 배수인 경) / +366

2020년 4월 16일
1년부터 2019년까지의 지나온 날수를 더합니다.

2. 년, 월을 입력 받아서 그 월의 달력을 출력