10월 24일 Day10

여우·2022년 10월 24일
0

공부중

목록 보기
4/38

1.클래스의 이해 복습

  • 클래스는 자료형이고, 객체는 클래스에 의해 만들어진 데이터이다.

  • 하나의 클래스로 여러개의 다른객체를 생성할 수 있다.

    		Number n1 = new Number(3);
    		Number n2 = new Number(5);
    		Number n3 = n1;
      

    Number 라는 클래스로 객체를 생성시 하나의 클래스로 여러 객체 생성이 가능하다.
    여기서 생성된 객체는 총 2개 ( n1, n2)이고 n3는 n1을 바라보는 참조 변수이다.

  • 클래스는 같은 패키지 내에서는 다른클래스에서도 사용이 가능하다.
    Number라는 클래스를 만들어 둔후 패키지내에 다른 클래스에서 호출이 가능하다.

    public class Ex02 {
    	Number[] arr = new Number[12];

    Ex02 클래스 안에 넘버 클래스를 사용하여 Number를 저장할 수 있는 배열이 생성된 상태 현재 이상태는 객체를 저장할 수 있는 참조변수 12개만 만들어진 상태로 배열은 현재 객체가 없이 비어져 있는 상태이다.

    for(int i = 0; i < arr.length; i++) {
    		arr[i] = new Number(i + 100);
    	} 

    현재 각 i +100의 값이 arr[i] 각각에 저장되도록하는 반복문.

2. 생성자

생성자는 지정한 클래스의 객체를 생성하는 특수한 함수(메서드)이다. 생성자는 함수이므로 오버로딩이 가능하다. 생성자를 작성하지 않으면, 컴파일시 기본 생성자를 자동으로 만들어준다. 이때, 기본 생성자란 매개변수를 전달 받지 않는 생성자를 말한다. 매개변수값을 받는 생성자를 따로 작성시 기본생성자가 만들어지지 않으므로, 기본생성자마저도 필요하다면 따로 선언해줄 필요가 있다.

생성자의 특징으로는 클래스처럼 첫글자가 대문자로 시작한다. 하지만 별도의 반환값을 가지지 않는다. 또한 void도 쓰지 않는다.

예시)

class Test1 {
}

Test1이라는 클래스가 만들어지고, main 함수 아래에
Test1 ob = new Test1();
Test1이라는 클래스로 ob라는 객체를 만들게 되면 자동으로 생성자가 만들어진다. 이때 생성자는

Test1(){
}

이런 형식으로 쓰여져 있고, 따로 작성하지 않아도 알아서 생성이 된다.

-생성자 오버로딩: 객체를 생성하는 여러 방식을 제공하겠다는 의미.

예시)

Circle(){
this(3.0);
}

Circle(int radius){
this((double)radius);
}

Circle(double radius){
this.radius = radius;
	area = radius * radius * pi;
	length = radius * 2 * pi;
}

세번째 생성자인 더블값을 받는 생성자를 사용하게 되어있는 구조이다. 첫번째 생성자는 기본생성자인데 이때 기본값 3을 더블 형식으로 바꾸어 Circle 생성자중에 더블형 매개변수를 받는 Circle이 호출된다. 여기서 this는 자기자신 Circle을 의미하며 자기 자신 Circle(double radius)를 호출한것이다.

두번째 생성자 또한 정수를 받았지만 더블형으로 바꾸어 호출된다. 이렇듯 잘 정의된 생성자 하나로 여러 방식으로 객체를 만들수 있다.

이렇게 생성자내에서 또다른 생성자를 호출하는 방식은 생성자내 첫번째 줄에서 선언하는것으로만 가능하다.

-생성자 호출 순서

Test2() {
	this(0);
	System.out.println("기본 생성자 호출 !!");
    }
    
 Test2(int num) {
	this.num = num;
	System.out.println("int 를 전달받는 생성자 호출 !!");
}

public static void main(String[] args) {
	Test2 ob1 = new Test2();
	Test2 ob2 = new Test2(12);
	}
}

먼저 메인함수가 실행이 되고 난 뒤 ob1객체가 생성이 되면서 기본생성자가 호출이 되는데 이때 이 생성자의 또다른 생성자 호출을 만나게 되어 Test2(int num)에 0이라는 값으로 호출이 되어

"int 를 전달받는 생성자 호출 !!"이라는 출력이 출력되고,
다시 함수를 호출했던 this(0)의 자리로 돌아가
"기본 생성자 호출 !!"이 출력이 되고 마지막으로
ob2 객체가 생성되며 Test2(int num)이 12라는 매개변수로 호출이되면 다시 한번
"int 를 전달받는 생성자 호출 !!"이라는 출력이 출력된다.

3. static

static이란 정적 멤버 요소를 만들때 사용된다. 정적멤버 요소란 특정 객체를 지목하지 않아도, 자료형에 각이 되어 있는 속성이나 기능을 말한다. 다시 말해 객체를 생성하지 않고서도 클래스로 접근이 가능하다. static요소들은 같은 클래스를 사용하는 모든 객체가 공유할 수 있다.

클래스: 객체를 생성하기 위한 자료형, 설계도와 같은 역할.
객체 : 클래스에 의해 만들어진 실체, 객체를 통하여 속성이나 기능에 접근할 수 있다.

예시)

휴먼 클래스로 멤버 필드로 이름과 나이를 가지며 정적요소로 count가 선언되어있다.
여기서 count는 초기화를 시키지 않아도 되며 초기화 되지 않으면 초기값은 부정에 가까운 0으로 초기화 된다.

Human 클래스를 이용하여 두개의 객체를 만들게 되면 생성자가 호출되며 count가 1씩 증가되어 현재 count값은 2가 된다.

그리고 ob1을 이용하여 ob1.count를 호출하게 하더라도 그 값인 2를 얻을 수 있다. 이는 현재 static으로 선언되어 있는 요소로 그 클래스를 이용해 만든 객체에서도 동일하게 사용하는 요소이기에 접근이 가능하다 다만 이렇게 접근하게 된다면 실행의 문제는 없어도 경고문이 나오게 된다. 이유는 static필드는 static 방법으로 접근해야 하는데 마치 이 객체의 고유 특성인것처럼 접근이 되기 때문에 그렇다. 그러므로 객체로 접근하는것이아닌 클래스.필드로 접근하는것이 올바른 방법이다.

-static 함수의 호출
예시)

n1은 객체를 통해서 접근이 가능하고
n2는 클래스를 통해서 접근할 수 있다.
showN1은 static이 아니고
showN2은 static 필드를 참조하는 메서드 이므로 동일하게 static을 지정해야 제기능을 수행할 수 있다.

Test3 ob = new Test3();

ob객체 생성을 하게 되면

ob.showN1();
ob.showN2();

둘다 사용은 가능하지만 showN2는 static요소이므로 경고메시지가 나오게된다.
반면에

    Test3.showN1();		<----X
	Test3.showN2();
    

클래스명으로 함수호출시 아래는 showN2는 잘 작동하지만 showN1은 아예 문법상 에러로 작동이 되지 않는다.

profile
우당탕탕 지금은 개발중

0개의 댓글