프로그래밍 기초탄탄#2 java-class

2022. 9. 29. 00:16java일지

2022/09/26

  • 학습내용

1.class

자바의 설계도

class에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.

어떤 속성을 갖는지 어떤 모양을 갖는지는 미리 틀이 정해져 있다.  -그게 class

1)인스턴스 - 클래스의 틀을 통해 만들어진 객체

인스턴스화 - 클래스로부터 객체를 만드는 과정
인스턴스는 한번 생성되고 나면 그 자체의 상태를 가지고 그 자체로 변화

 

붕어빵 기계라는 클래스에서 '굽다' 메소드를 실행시켜 붕어빵을 굽는다.

그리고 만들어진 붕어빵들은 전부 객체들이다.

하지만 같은 기계에서 만들어졌어도 서로 다른 밀가루 량과 팥을 가지고 있다.

실제로 만들어진 붕어빵인 이것이 인스턴스이며 이 붕어빵을 굽는 행위가 인스턴스화이다.

 

class 이름은 java의 식별자 작성 규칙에 따라서 작성한다.

1) 하나 이상의 문자로 이루어져야 한다.

2) 첫 글자에는 숫자가 올 수 없다.

3)'$' '_' 외의 특수 문자는 사용할 수 없다.

4) java 키워드는 사용할 수 없다.

 

2)class 선언

일반적으로 소스 파일당 하나의 class를 선언하지만, 2개 이상의 class 선언도 가능하다.

2개 이상의 class가 선언된 소스 파일을 컴파일하면 바이트 코드 파일(.class)은 class를 선언한 개수만큼 생긴다.

 

public 접근 제한자

public 접근 제한자는 파일 이름과 동일한 이름의 class 선언에만 붙일 수 있다.

 

3)객체 생성

class로부터 객체를 생성하려면 new 연산자를 사용해야 한다.

new 클래스();

new는 class로부터 객체를 생성시키는 연산자이다.

new로 생성된 객체는 메모리 힙 영역에 생성된다.

 

new 연산자는 힙 영역에 객체를 생성시킨 후 객체의 번지를 return한다.

클래스 변수;
변수 = new 클래스();

클래스 변수 =  new 클래스();  // 클래스 변수 선언과 객체 생성을 1개의 실행문으로 작성 가능

 

4)class의 용도

① 라이브러리(API)용

다른 class에서 이용할 목적으로 설계된다.

프로그램 전체에서 사용되는 class가 100개라면 99개는 라이브러리 class이고 단 하나가 실행 class다.

② 실행용

실행 class는 프로그램의 실행 진입점인 main() 메소드를 제공하는 역할을 한다.

 

5)class의 구성 멤버

구성 멤버들은 생략되거나 복수의 개수로 작성될 수 있다.

  필드

필드는 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳이다.

생성자와 메소드 내에서만 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다.

 

타입 필드 [=초기값];


//ex)
String company = "문자 예시"
int maxSpeed = "숫자 예시"

필드 선언은 변수의 선언 형태와 비슷하다.

필드는 클래스 멤버 변수라고 부르기도 한다.

필드 선언은 클래스 중

필드의 초기값은 필드 선언 시 주어질 수도 있고 생략될 수도 있다.

초기값이 주어지지 않은 필드는 객체 생성 시 자동으로 기본 초기값으로 설정된다.

-> 0, 0.0, false, null 등의 기본 초기값

public class Car() {
	//필드
	int speed;

	//생성자
	Car() {
 		speed = 0;
	}

	//메소드
	void method( ... ) {
		speed = 10;
	}

}

생성자(construct)

생성자는 new 연산자로 호출되는 특별한 중괄호{} 블록이다.

생성자의 역할은 객체 생성 시 초기화를 담당한다.

필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 한다.

생성자는 메소드와 비슷하게 생겼지만, class 이름으로 되어 있고 return 타입이 없다.

생성자의 이름은 클래스랑 똑같이 지어준다. -생성자 규칙

 

메소드(멤버 함수)

메소드란 opp에서 클래스 내부에 정의된 함수를 말한다.

메소드는 프로그램이 실행되고 있을 때 클래스에서 생성된 인스턴스와 관련된 동작을 정의한다.

메소드는 객체의 동작(실행문)에 해당하는 중괄호{} 블록이다.

메소드를 호출하게 되면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행된다.

메소드 블록 내에서 선언된 변수를 로컬 변수라고 부른다.

메소드는 객체 간의 데이터를 전달하는 수단의 역할도 한다.

외부(호출한 곳)로부터 매개값을 받아 실행에 이용하고, 실행 후 결과 값을 외부로 return할 수도 있다.

어떤 일정한 작업의 단위, 중복된 코드가 있다면, 프로그램의 재사용성 구조화를 위해서 메소드를 선언해서 사용한다.

 

메소드 선언 

선언부(return type, 메소드 명, 매개 변수 선언), 실행 블록으로 구성되어 있다.

 

1)리턴 타입이 있는 메소드

메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴문을 사용해서 리턴값을 지정해야 한다.

리턴문이 실행되면 메소드는 즉시 종료된다.

 

2)리턴 타입이 없는 메소드 :void

메소드 선언에 리턴 타입이 없는 메소드는 void를 사용한다.

void로 선언된 메소드도 리턴문을 사용하는데 그건 리턴값을 지정하는 것이 아니라 메소드 실행을 강제 종료한다.

 

메소드 호출

클래스 내부: 메소드 이름으로 호출

클래스 외부: 우선 클래스로부터 객체를 생성한 뒤 참조 변수를 이용해서 메소드를 호출한다.

-> 객체가 존재해야 메소드도 존재하기 때문이다.

<클래스 외부 호출>
void 외부메소드() {
Car car = new Car();  //객체 생성
car.run();
car.stop();

메소드 오버로딩

오버로딩의 종류 중 하나 메소드 오버로딩, 다른 하나는  생성자 오버로딩이다.

메소드 오버로딩은 매개변수의 개수 또는 타입, 순서 이 셋 중에서 하나만 달라도 오버로딩이 성립된다.

※주의

매개변수의 개수 또는 타입, 순서는 같은데 리턴타입만 다를 경우에는 오버로딩이 성립되지 않는다.

 

메소드 오버로딩 ex)

// 메소드 오버로딩하기 위한 클래스 생성
class Test {
   // test() 호출
   static void test() {
       System.out.println("매개변수 = 없음");
   }
   // test에 매개변수a로 int형 호출
   static void test(int a) {
       System.out.println("매개변수 = " + a);
   }
   // 매개변수 개수 변경 : test에 매개변수a,b로 int형 2개 호출
   static void test(int a, int b) {
       System.out.println("매개변수 = " + a + "," + b);
   }
   // 매개변수 타입 변경 : test에 매개변수a로 char형 호출
   static void test(char a) {
       System.out.println("매개변수 = " + a);
   }
}
// 메소드 오버로딩 사용
public class MethodOverloading {
   public static void main(String[] args) {
       // 객체 생성
       Test test = new Test();
       // test() 호출 -> 출력 : 매개변수 = 없음
       ol.test();
       // test(int a, int b) 호출 -> 출력 : 매개변수 = 5 , 10
       ol.test(5, 10);
       // test(char a) 호출 -> 출력 : 매개변수 = x
       ol.test(x);
   }
}
[ 출력값 ]
매개변수 = 없음
매개변수 = 5 , 10
매개변수 = x

※메소드를 선언할 때 지켜주면 좋은 코드 convention
1. 동사로 시작
2. 케멀 케이스

 

class, 인스턴스 설명 코드 ex)

class Phone {
    String model;
    String color;
    int price;        			//Phone class는 model,color,price라는 속성을 가진다.
}

public class main {  			//main 함수에서 Phone class에 해당하는 객체를 만드는데
    public static void main(String[] args) {

Phone galaxy = new Phone();  	//그 객체 이름을 galaxy로 지었다.
        galaxy.model = "Galaxy10";
        galaxy.color = "Black";
        galaxy.price = 100;        //그 객체 galaxy 값들을 할당

        Phone iphone = new Phone();  // 또 아이폰이라는 객체를 만들었는데
        iphone.model = "iPhoneX";
        iphone.color = "Black";
        iphone.price = 200;    // 그 아이폰 객체의 값들을 할당

//인스턴스의 멤버에 접근할 때는 멤버 이름(iphone) 뒤에 .을 찍고 멤버 변수(model...)를 선언 해주면 접근할 수 있다.

        System.out.println("철수는 이번에 " + galaxy.model + galaxy.color + " 색상을 " + galaxy.price + "만원에 샀다.");
        System.out.println("영희는 이번에 " + iphone.model + iphone.color + " 색상을 " + iphone.price + "만원에 샀다.");

 

생성자 complie error ex)

//세 개 짜리 파라미터를 받는 생성자가 있는데 아무것도 안 넣어 줬으니까 이건 complie error야