DAY_011[국비] 자바 웹프로그래밍 과정

Bona의 블로그 입니다.·2022년 10월 12일
0

국비과정

목록 보기
12/99

 🌞 Day 011 : 클래스 복습, this 변수 

  • 호출한 객체 => this!!



 🌰 1 교시 

 ⭐ 연습 문제 

  • 아래 (코드블럭의) 생성자들이 모두 실행 가능하도록 생성자를 제작

  • 모든 생성자에서 scores에 정수 세 개를 저장할 배열을 만들고 주소를 저장하도록 코딩

  • 매개변수가 없는 생성자는 모든 변수값(번호, 이름, 점수)을 임의 값으로

  • 매개변수에 이름만 전달되는 생성자는 이름을 제외한 모든 변수값을 임의의 값으로

  • 이름과 점수가 전달되는 생성자는 번호만 임의의 값으로 저장하고,
    다른 값들은 전달값으로 변수에 대입

  • prn() 메서드는 멤버변수들의 값을 이용하여 출력하되 양식은 임의로 설정

  • 내가 작성한 코드

※ JAVA 에러
“Array constants can only be used in initializers”
⇒ 초기화가 제대로 안되어 있다.
⇒ new를 사용해서 메모리에 자리를 할당하고 값을 넣어야 한다.

※ 생성자는 대개 멤버변수의 초기값을 주는 역할을 하는 경우가 많다.

  • 생성자 3의 수정이 필요하다



 🌰 2 교시 

 🍇 클래스 Class - 복습 

  • class란?
    프로그램에서 처리하고자 하는 대상(유기체, 무기체 또는 문자, 숫자, 자료 등)을 '자료화'하여 정의한 것
  • 자료화
    : 대상의 세부내용을 변수로 만들고, 그들을 class 묶어서 사용하는 것
    예) 학생 class에 이름, 국어, 영어, 수학, 총점, 평균을 변수로 정의하고 이를 하나의 자료로서 Student라고 부르는 것을 의미

 🌱 클래스 기본 문법 

  • 클래스 정의는 설계도와 같은 정의 영역.
  • 정의된 클래스만 가지고는 아무 것도 할 수가 없다.
  • 그 클래스 형태의 객체가 생성되어야 정의된 내용이 실제 구현되어 실행된다고 할 수 있다.
  • 클래스를 사용함으로써 자료 처리의 단위가 변경된다.
    프로그램이나 자료 중심의 처리 => 개발자 중심의 처리


 🌱 멤버메서드 



 🌰 3 교시 

  • 멤버 메서드도 물론 오버로딩이 가능하다.

  • 멤버 메서드 생성의 주된 목적
    : 멤버 변수에 값을 대입하고, 연산하고, 출력하는 것

  • 목적대로 한다면 d1.name = "댕댕이"; 연산이 가능하므로, 메서드가 필요 없을 수도 있다.

  • 다만 멤버변수에 private이 붙어 있다면 d1.name="댕댕이";가 불가능 하므로, public 형태의 멤버메서드를 생성하여 사용한다.

  • 멤버변수의 값을 대입하거나 가져오는 메서드를 가장 빈번하게 만든다.
    이클립스에서는 아예 getter와 setter 메서드를 자동으로 만들어준다.

 🌱 getter와 setter의 자동 생성 

  • 현 위치에서 마우스 오른쪽 버튼 클릭(getter & setter 만들 위치)
    -> Source 메뉴 -> Generate Getters and Setters 선택
    -> selectAll 클릭 -> Generate 클릭

 🌱 this 변수 

  • 멤버 메서드는 한 개 만들어지고, 모든 객체가 그 메서드를 공유해서 사용한다.
    많은 객체가 필요할 때마다 메서드를 호출한다.

  • 그렇다면 호출되는 그 메서드는 누가 호출했는지 어떻게 구분하는가?

  • 객체 하나가 메서드를 호출하면, 눈에 보이지 않게 호출객체의 참조값(주소)이 전달된다.

  • 그 참조값은 눈에 보이지 않은 'this'라는 참조 매개변수에 저장된다.
    ex ) c1(객체)이 호출하면   c1 -> this

  • this변수는 매개변수와 멤버변수가 이름이 같은 경우 그들을 구별하기 위해 많이 사용된다. (구별할 필요성이 없다면 생략 가능)



 🌰 4 교시 

 🌱 생성자 메서드 (Constructor) 

  • 생성자도 메서드이다.

  • 객체가 선언되는 시점에 딱 한 번 호출되고 그 외에는 호출되지 않는다.

  • new명령과 함께 객체가 새로운 공간을 만들고 저장되도록 해준다.

  • 클래스이름과 생성자 메서드의 이름은 같다.

  • 리턴값이 없다.

  • 내가 따로 기술하지 않아도 내부에 이미 존재하고 있는 메서드 이다.

  1. 생성자를 따로 기술하지 않아도 이미 존재하는 메서드라서 에러없이 호출이 가능하다.
    배열 생성시 int [] a = new int[5]; 라고 쓰듯 객체생성이 비슷하게 이루어진다.

  2. 따로 기술하지 않아도 호출가능한 건 따로 기술해도 가능하다는 뜻.
    다만 따로 기술하되 아무 명령도 넣지 않으면, 따로 기술하지 않은 것과 같다.

  3. 따로 기술한다는 것은 주로 멤버변수의 초기값을 주기 위해서 많이 사용된다.
    생성자도 메서드이므로 매개변수가 있을 수 있다.
    생성자의 고유기능 외에 추가로 실행할 명령이 쓰여지고,
    멤버변수의 값을 초기화하고자 할 때 사용한다.

  4. 생성자가 안에서 밖으로 꺼내져 와서 매개변수가 있는 생성자로 재정의 되는 순간 숨어있던 매개변수 없는 디폴트 생성자는 없어진다.
    (매개변수 있는 생성자로 대체)
    매개변수가 없는 디폴트 생성자도 사용하려면 오버로딩해서 사용해야 한다.

  5. 생성자의 매개변수에 반드시 멤버변수에 필요한 값들만 선언되어야 하는 것은 아니다.
    하지만 멤버변수에 필요한 값들이 매개변수에 전달되도록 하는 것이 보통.
    생성자 또는 메서드의 오버로딩은 필요에 따라 제작하는 것을 권장하며,
    호출되지 않을 생성자와 메서드의 오버로딩은 만들지 않는 것을 권장한다.


 🌱 this 키워드의 용도 #1 

  • this 변수는  레퍼런스(참조) 변수 

  • 멤버변수는 new 생성자()에 의해 새로운공간 객체별로 각각 만들어진다.
    ( new로 새로 생성된 뉴인스턴스의 주소값이 생성자의 this로 )

  • 반면에 멤버메서드는 한 개만 만들어지며 각 객체들이 공유 & 호출해서 사용

  • 이 때 메서드 내에는 누가 자신을 호출했는지 구분하기 위해  this라는 참조변수 를 준비해놓는다.

  •  "호출한"  객체의 참조값이 this

  • this변수는 따로 기술하지 않은 숨어있는 변수

  • this에는 현재 메서드를 호출한 객체의  참조변수값 이 전달되어 저장
    멤버변수를 this없이 사용해도 이름이 중복된 매개변수가 아니라면
    내부적으로 this가 모두 붙어서 실행된다.



 🌰 5 교시 

 ⭐ 연습 문제 : this 연습 (1) 

  • 문제

  • 코드 작성



 🌰 6 교시 

 🌱 this 키워드의 용도 #2 

  • 오버로딩 되어 있는 생성자들이 서로를 재호출 하기 위한 이름으로 사용.

  • 호출하는 형태(매개변수의 형태)데로 생성자가 오버라이딩 되어 있어야 사용가능


 ⭐ 연습 문제 : this 연습 (2) 

  • 문제
    • 디폴트 생성자에서 배열(scores)에 저장공간을 할당하기
      정수 3자리 배열 그외 동작 없음
    • String 자료를 전달인수로 하는 생성자에서 전달된 이름을 멤버변수에 저장하고 그 외 점수는 임의 점수를 입력
    • String 자료와 점수들을 전달인수로 하는 생성자는 각 전달값을 멤버변수에 저장
    • 필요한 형제 생성자를 this로 호출할 것!
    • copy1과 copy2를 제작하기 (멤버메서드)
  • 코드 작성



 🌰 7 교시 

 🌱 static 키워드 

  • static 키워드
    멤버변수, 멤버메소드에 적용할 수 있는 키워드
    정적 변수(클래스의 변수), 정적메소드(클래스의 메소드)를 선언할 때 사용

  •  자바프로그램의 구동과정 
    ( JVM(자바 버추얼 머신) : jsp를 실행시켜줌, jsp가 호환성이 높은 이유 )

    1. JVM에 의해서 실행할 모든 클래스 중, static메소드, static멤버필드를 수집해서 메모리에 로딩되고, 프로그램의 시작(main메소드)전에 메모리에 적재
    2. 메모리에 로딩된 static 메소드 중, main을 검색
    3. main메소드가 검색되었다면 JVM 해당 main메소드를 호출하여 프로그램을 시작
  •  static 변수/메서드의 특징 

    • 프로그램 실행 전부터 메모리에 자리를 확보하고, 실행되기를 기다리는 변수 & 메서드

    • static 변수 : 얘도 멤버변수, static 멤버 변수, 정적멤버변수

    • 스태택 변수는 프로그램 실행 전(객체가 만들어지기 전)에 먼저 생성되어서 사용할 준비가 완료되는 변수

    • 객체 생성과 상관없이, 만들어지는 객체의 개수와도 상관없이
      "딱 한 개" 만들어지는 변수

    • 그를 둘러싼 클래스에 소속되어 사용되지만, 객체와는 독립적으로 사용된다.

  •  static이 아닌 변수 메서드의 특징 

    • Student std = new Student()와 같은 객체 생성 명령이 있어야 그제야 객체 안에 만들어지는 변수 & 메서드
    • 인스턴스 변수
      : 멤버변수 이면서 static이 아닌 변수, 동적 멤버변수
  • 다른 클래스에서는 안그런데 main메서드가 포함된 클래스에서 메서드를 추가하면 유독 static을 붙여서 제작한 이유 

    • main이 호출할 거니까

    • 미리 메모리에 적재된 main 안에서 호출해서 사용하려면
      그 호출대상도 메모리에 적재되어 있어야 한다.

    • 그러려면 어쩔 수 없이 static으로 제작 되어야 한다.

  •  정리 
  1. 정적멤버변수(static멤버변수)는 객체의 생성유무와 상관없이 그 변수를 사용할 수 있다.
    스태틱 변수는 main 메서드 실행 전에, 객체생성 전에, 미리 생성되어 있는 변수이다.
    객체와는 독립적이면서, 클래스에는 종속적으로 사용하도록 생성된다.
    static변수는 객체를 생성하지 않고도 사용할 수 있는 클래스의 멤버변수이다.
    다만 클래스 외부에서 static변수에 접근하려면 클래스 이름과 함께 사용한다. (메서드도 마찬가지)
    예시) 클래스이름.변수이름
            StaticA.number -> StaticA클래스의 number 변수
            Math.random() -> Math 클래스의 static 메서드
            Integer.parseInt() -> Integer클래스의 static메서드

  2. 동적멤버변수(인스턴스멤버변수)는 객체가 반드시 생성되어야 그 변수를 사용할 수가 있다

  3. 인스턴스 변수는 객체 생성마다 만들어져서 객체의 개수만큼 생성된다.
    static변수는 프로그램 전체를 통틀어 한 개만 만들어지고,
    그 값도 객체와 상관없이 현재 값이 변경 전 또는 프로그램 끝날 때까지 유지된다.

  4. 인스턴스와 마찬가지로 static변수도 private으로 보호되지 않았다면 아래와 같이 임의 접근이 가능하다.
    StaticA.number = 10; (number가 static변수)
    private로 보호된 static변수는 static메서드를 따로 제작해서 값을 저장하거나 얻어 내야 한다.
    static이 아닌 인스턴스 메서드에서는 static 멤버/메서드의 접근이 불가능하다.
    따라서 private로 보호된 static에 접근하려면 static 메서드로 접근해야 한다.



 🌰 8 교시 

  • 스태틱 변수는 클래스 내부에 존재하지만,
    객체 생성과 상관없이 프로그램 시작 전 한 번만 생성되고,
    프로그램 종료시까지 변수 값을 일관되게 유지 또는 변경 관리 한다.

  • 가장 쉽게 활용하는 방법
    : 일정 interval의 일련번호, 생성된 객체의 개수, 일관된 지표를 나타내는 기준값


 ⭐ 연습 문제 : static 변수 

  • 문제

    • 전달인수 없는 생성자에서 count를 증가하고 번호를 저장한다.
    • 그 외 생성자에서는 전달인수 없는 생성자를 호출해서 해당 코드가 실행되게 작성 한다.
    • 출력은 아래 양식에 맞추고, 전체 학생수를 맨 아래 출력하기
  • 코드 작성



 🌼 마무리... 

  • this는 확실히 잘 생각하지 않으면 헷갈린다.
    "호출한" 쪽이 this라는 것을 꼭 기억해야지
  • static과 접근 제어자도 구분할 것!!!
  • 배우는 것이 늘어날 수록 앞에 기초들이 더 중요한 것 같다.



profile
제가 공부하고 공유하고 싶은 글을 올리고 있습니다.

0개의 댓글