아래 (코드블럭의) 생성자들이 모두 실행 가능하도록 생성자를 제작
모든 생성자에서 scores에 정수 세 개를 저장할 배열을 만들고 주소를 저장하도록 코딩
매개변수가 없는 생성자는 모든 변수값(번호, 이름, 점수)을 임의 값으로
매개변수에 이름만 전달되는 생성자는 이름을 제외한 모든 변수값을 임의의 값으로
이름과 점수가 전달되는 생성자는 번호만 임의의 값으로 저장하고,
다른 값들은 전달값으로 변수에 대입
prn() 메서드는 멤버변수들의 값을 이용하여 출력하되 양식은 임의로 설정
내가 작성한 코드
※ JAVA 에러
“Array constants can only be used in initializers”
⇒ 초기화가 제대로 안되어 있다.
⇒ new를 사용해서 메모리에 자리를 할당하고 값을 넣어야 한다.
※ 생성자는 대개 멤버변수의 초기값을 주는 역할을 하는 경우가 많다.
멤버 메서드도 물론 오버로딩이 가능하다.
멤버 메서드 생성의 주된 목적
: 멤버 변수에 값을 대입하고, 연산하고, 출력하는 것
목적대로 한다면 d1.name = "댕댕이";
연산이 가능하므로, 메서드가 필요 없을 수도 있다.
다만 멤버변수에 private이 붙어 있다면 d1.name="댕댕이";
가 불가능 하므로, public 형태의 멤버메서드를 생성하여 사용한다.
멤버변수의 값을 대입하거나 가져오는 메서드를 가장 빈번하게 만든다.
이클립스에서는 아예 getter와 setter 메서드를 자동으로 만들어준다.
멤버 메서드는 한 개 만들어지고, 모든 객체가 그 메서드를 공유해서 사용한다.
많은 객체가 필요할 때마다 메서드를 호출한다.
그렇다면 호출되는 그 메서드는 누가 호출했는지 어떻게 구분하는가?
객체 하나가 메서드를 호출하면, 눈에 보이지 않게 호출객체의 참조값(주소)이 전달된다.
그 참조값은 눈에 보이지 않은 'this'라는 참조 매개변수에 저장된다.
ex ) c1(객체)이 호출하면 c1 -> this
this변수는 매개변수와 멤버변수가 이름이 같은 경우 그들을 구별하기 위해 많이 사용된다. (구별할 필요성이 없다면 생략 가능)
생성자도 메서드이다.
객체가 선언되는 시점에 딱 한 번 호출되고 그 외에는 호출되지 않는다.
new명령과 함께 객체가 새로운 공간을 만들고 저장되도록 해준다.
클래스이름과 생성자 메서드의 이름은 같다.
리턴값이 없다.
내가 따로 기술하지 않아도 내부에 이미 존재하고 있는 메서드 이다.
생성자를 따로 기술하지 않아도 이미 존재하는 메서드라서 에러없이 호출이 가능하다.
배열 생성시 int [] a = new int[5];
라고 쓰듯 객체생성이 비슷하게 이루어진다.
따로 기술하지 않아도 호출가능한 건 따로 기술해도 가능하다는 뜻.
다만 따로 기술하되 아무 명령도 넣지 않으면, 따로 기술하지 않은 것과 같다.
따로 기술한다는 것은 주로 멤버변수의 초기값을 주기 위해서 많이 사용된다.
생성자도 메서드이므로 매개변수가 있을 수 있다.
생성자의 고유기능 외에 추가로 실행할 명령이 쓰여지고,
멤버변수의 값을 초기화하고자 할 때 사용한다.
생성자가 안에서 밖으로 꺼내져 와서 매개변수가 있는 생성자로 재정의 되는 순간 숨어있던 매개변수 없는 디폴트 생성자는 없어진다.
(매개변수 있는 생성자로 대체)
매개변수가 없는 디폴트 생성자도 사용하려면 오버로딩해서 사용해야 한다.
생성자의 매개변수에 반드시 멤버변수에 필요한 값들만 선언되어야 하는 것은 아니다.
하지만 멤버변수에 필요한 값들이 매개변수에 전달되도록 하는 것이 보통.
생성자 또는 메서드의 오버로딩은 필요에 따라 제작하는 것을 권장하며,
호출되지 않을 생성자와 메서드의 오버로딩은 만들지 않는 것을 권장한다.
this 변수는 레퍼런스(참조) 변수
멤버변수는 new 생성자()
에 의해 새로운공간 객체별로 각각 만들어진다.
( new로 새로 생성된 뉴인스턴스의 주소값이 생성자의 this로 )
반면에 멤버메서드는 한 개만 만들어지며 각 객체들이 공유 & 호출해서 사용
이 때 메서드 내에는 누가 자신을 호출했는지 구분하기 위해 this라는 참조변수 를 준비해놓는다.
"호출한" 객체의 참조값이 this
this변수는 따로 기술하지 않은 숨어있는 변수
this에는 현재 메서드를 호출한 객체의 참조변수값 이 전달되어 저장
멤버변수를 this없이 사용해도 이름이 중복된 매개변수가 아니라면
내부적으로 this가 모두 붙어서 실행된다.
문제
코드 작성
오버로딩 되어 있는 생성자들이 서로를 재호출 하기 위한 이름으로 사용.
호출하는 형태(매개변수의 형태)데로 생성자가 오버라이딩 되어 있어야 사용가능
static 키워드
멤버변수, 멤버메소드에 적용할 수 있는 키워드
정적 변수(클래스의 변수), 정적메소드(클래스의 메소드)를 선언할 때 사용
자바프로그램의 구동과정
( JVM(자바 버추얼 머신) : jsp를 실행시켜줌, jsp가 호환성이 높은 이유 )
static 변수/메서드의 특징
프로그램 실행 전부터 메모리에 자리를 확보하고, 실행되기를 기다리는 변수 & 메서드
static 변수 : 얘도 멤버변수, static 멤버 변수, 정적멤버변수
스태택 변수는 프로그램 실행 전(객체가 만들어지기 전)에 먼저 생성되어서 사용할 준비가 완료되는 변수
객체 생성과 상관없이, 만들어지는 객체의 개수와도 상관없이
"딱 한 개" 만들어지는 변수
그를 둘러싼 클래스에 소속되어 사용되지만, 객체와는 독립적으로 사용된다.
static이 아닌 변수 메서드의 특징
Student std = new Student()
와 같은 객체 생성 명령이 있어야 그제야 객체 안에 만들어지는 변수 & 메서드다른 클래스에서는 안그런데 main메서드가 포함된 클래스에서 메서드를 추가하면 유독 static을 붙여서 제작한 이유
main이 호출할 거니까
미리 메모리에 적재된 main 안에서 호출해서 사용하려면
그 호출대상도 메모리에 적재되어 있어야 한다.
그러려면 어쩔 수 없이 static으로 제작 되어야 한다.
정적멤버변수(static멤버변수)는 객체의 생성유무와 상관없이 그 변수를 사용할 수 있다.
스태틱 변수는 main 메서드 실행 전에, 객체생성 전에, 미리 생성되어 있는 변수이다.
객체와는 독립적이면서, 클래스에는 종속적으로 사용하도록 생성된다.
static변수는 객체를 생성하지 않고도 사용할 수 있는 클래스의 멤버변수이다.
다만 클래스 외부에서 static변수에 접근하려면 클래스 이름과 함께 사용한다. (메서드도 마찬가지)
예시) 클래스이름.변수이름
StaticA.number
-> StaticA클래스의 number 변수
Math.random()
-> Math 클래스의 static 메서드
Integer.parseInt()
-> Integer클래스의 static메서드
동적멤버변수(인스턴스멤버변수)는 객체가 반드시 생성되어야 그 변수를 사용할 수가 있다
인스턴스 변수는 객체 생성마다 만들어져서 객체의 개수만큼 생성된다.
static변수는 프로그램 전체를 통틀어 한 개만 만들어지고,
그 값도 객체와 상관없이 현재 값이 변경 전 또는 프로그램 끝날 때까지 유지된다.
인스턴스와 마찬가지로 static변수도 private으로 보호되지 않았다면 아래와 같이 임의 접근이 가능하다.
StaticA.number = 10;
(number가 static변수)
private로 보호된 static변수는 static메서드를 따로 제작해서 값을 저장하거나 얻어 내야 한다.
static이 아닌 인스턴스 메서드에서는 static 멤버/메서드의 접근이 불가능하다.
따라서 private로 보호된 static에 접근하려면 static 메서드로 접근해야 한다.
스태틱 변수는 클래스 내부에 존재하지만,
객체 생성과 상관없이 프로그램 시작 전 한 번만 생성되고,
프로그램 종료시까지 변수 값을 일관되게 유지 또는 변경 관리 한다.
가장 쉽게 활용하는 방법
: 일정 interval의 일련번호, 생성된 객체의 개수, 일관된 지표를 나타내는 기준값
문제
코드 작성