문제
배열에서 했던 예제를 응용한 문제
Class?
프로그램으로 처리하고자 하는 대상을 자료화해서 하나의 자료형으로 정의한,
사용자 정의 자료형
필요에 의해 기본자료형(int, double, char 등)외에 새롭게 정의한 자료형
한 개 이상의 자료, 하나 이상의 자료형을 저장할 수 있는 복합 자료형
활용되기 이전, 정의만되어 있는 클래스는 정의영역(설계도, 원본)이다.
그동안 사용해오던 Scanner도 클래스이다.
Scanner sc = new Scanner(System.in);
변수선언(참조변수)
자바의 프로그램 단위는 클래스 이다.
하나의 프로그램 파일(XXX.java) 안에는 여러 개의 클래스를 넣어서 사용할 수 있다.
여러 개의 클래스 중 파일이름과 "같은" 이름을 쓰는 클래스를 public으로 지정 한다.
그 클래스에는 보통 public static void main(){ }
이 존재
그 클래스는 자료형으로서의 클래스이기 보단 프로그램 실행단위로서 클래스 이다.
앞으로 우리가 만들어서 사용하거나, import해서 사용할 클래스는 자료저장 & 가공용 클래스가 많다.
클래스 만드는 법 : Class라는 키워드를 이용해서 만든다.
First라는 클래스를 만들면서 Class 익히기
속성(멤버필드, 멤버변수, 필드)
: 클래스에 속한 정보(변수)들.
속성은 변수로 생성하며 클래스의 '멤버필드'라고도 호칭 한다.
클래스를 만들면 그들을 프로그램에 적용하기위해 "클래스 변수"를 클래스 이름으로 생성한다.
First a1;
생성된 변수는 레퍼런스(참조)변수이다.
배열 때와 마찬가지로, new 명령을 이용하여 HEAP 영역에
적정공간(클래스가 정의된 크기만큼)을 확보한 후,
그 주소를 a1변수에 저장하여 사용한다.
레퍼런스 변수와 new에의해 만들어진 공간이 합쳐지면,
이를 "객체"라고 부른다
멤버 메서드
클래스에 소속되어 클래서 객체에 종속된 메서드
멤버 메서드는 특별한 경우를 제외하고는 'static'을 사용하지 않는다.
static : 정적 멤버를 선언할 때 사용
(정적 static - "처음부터 만들어지는"이라는 뜻)
클래스 안에 있는 멤버 메서드
같은 클래스 내부에 정의 되어 있는 메서드에서 변수를 사용할 때,
변수 앞에 객체 이름을 붙이지 않는다.
객체 이름을 쓰는 경우는 클래스 외부에서 실제 객체가 만들어지고,
(외부에서) 멤버변수나 멤버메서드가 사용될 때 붙인다.
멤버변수와 멤버메서드는 필요한만큼 제한없이 생성 & 사용이 가능
멤버메서드는 클래스형으로 생성된 객체 "전용" 메서드이다.
메서드의 실행이 객체전용으로만 사용이 된다는 뜻
멤버메서드의 내용은 해당 객체와 상관없는 명령이 들어갈 수도 있지만
보통은 멤버변수들의 조작, 출력, 입력을 위한 명령들로 주로 구성된다.
멤버 메서드는 멤버변수처럼 객체가 만들어지고,
그 객체가 앞에(.)과 같이 있어야 사용 가능하다.
ex) a1.name a1.age
a1 객체 내에 생성된 name, age변수의 값을 이용해서 output 멤버 메서드가 실행된다.
name과 age는 각각의 객체에 따로 만들어지지만, 멤버 메서드는 각 객체들에게 "공유"된다.
다른 객체가 실행할 때도 각자 자신의 name과 age 값으로 output이 실행된다.
접근 지정자?
모든 클래스의 멤버는 현실에 존재하는 대상의 정보로서,
직접적인 접근이 허용되는 것과 허용되면 안되는 정보가 있다.
접근 지정자는 클래스의 멤버들에 대한 접근을 제어하는 키워드이다.
클래스의 멤버변수와 멤버메서드는 접근지정자(private, public, protected)에 의해서 외부에서의 접근을 조절할 수 있다.
접근지정자를 사용하지 않는 경우 기본지정으로 public이 설정되며,
클래스 외부에서 직접 접근이 가능하다.
이는 멤버변수의 값이 무분별하게 수정될 수 있다는 뜻
이를 방지하고 무분별한 접근을 막기위해 멤버변수에 private을 지정
private으로 지정된 멤버는 자기자신이 속한 class 내부의 멤버메서드만 접근 가능하다.
멤버메서드는 대개 public으로 지정되며, 외부에서 자유로운 접근이 가능하다.
정리
※ 캡슐화 : 여러 자료를 하나로 묶는 것
※ 은닉화 : 중요자료를 보호, 감추는 것
private으로 보호되는 멤버변수에 값을 저장하거나, 얻어오거나
그 둘의 목적이 가장 크다.
따라서 특정 멤버메서드(값을 저장하거나 얻어오는 메서드)를 별도의 사유없이 필요한만큼 만들고 시작하는 경우가 많다.
메서드의 이름은 getter, setter와 멤버변수이름을 조합해서 만든다.
이클립스에서 이런 멤버메서드를 자동으로 만들어주는 기능이 있다.
[ getter setter의 자동생성 ]
1. 현 위치에서 마우스 오른쪽 버튼 클릭
2. Source 메뉴
3. Generate Getters and Setters 선택
4. selectAll 클릭
5. Generate 클릭
생성자(Constructor)
클래스의 객체가 생성될 때, 멤버필드의 초기화 등의 목적으로 사용되는 메서드 new에 각각의 객체가 생성될 때, 서로 다른 메모리를 할당해서 서로 겹치지 않게 하는 기능도 포함한다.
생성자의 특징
앞선 예제와 같이 클래스 내부에 생성자를 꺼내어 따로 정의 하지 않으면,컴파일러는 자동을 클래스 내부에 숨어 있는 생성자(디폴트 생성자)를 호출한다.
디폴트 생성자 : Bclass(){}와 같이 생겨서 기본 형태만 설정된 생성자
내용없이 생성자를 따로 정의하는 것은, 따로 생성자를 아예 기술하지 않는 것과 같다.
그러나 매개변수가 생기거나 추가 명령이 필요하다면 꺼내놓고 추가 기술을 해서 이용할 수 있다.
생성자도 리턴값이 없을 뿐, 메서드이므로 매개변수를 사용할 수 있다.
생성자의 매개변수를 활용하는 경우 각각의 객체마다 서로 다른 값을 가질 수 있다.
클래스 내부에 매개변수가 있는 생성자가 꺼내진 경우, 매개변수가 없는 디폴트 생성자는 새로 생성된 생성자로 대체되어서 없는 생성자가 된다.
(디폴트 생성자가 없어진 것)
따라서 매개변수가 있는 생성자가 꺼내진 경우, 매개변수 없는 디폴트 생성자를 따로 적어 주어야 한다.
(매개변수 없는 생성자를 이용해서 객체를 만들려면)
문제
코드작성
int형 자료를 매개변수로하는 생성자와 디폴트 생성자를 오버로딩하는 클래스 생성하기
전달 인수가 있으면 전달인수를 매개변수 dan에 저장, 없으면 dan에 0저장
멤버변수는 int dan; 한 개만 생성
멤버메서드는 print() 하나
dan이 0이 아니면 해당 구구단 출력
dan이 0이면 2~9 구구단 모두 출력
내가 쓴 코드
2~9단이 한 단씩 세로로 출력되는 코드
2~5단 / 6~9단이 한 줄에 쭉 출력되도록 수정함