알아둘 것
(.)은 안에 있는 것을 뜻한다.
(클래스. 변수)는 클래스 안에 있는 변수를 뜻함.
클래스(설계도)
객체를 만들기 위한 설계도, 속성(변수)과 기능(메서드)이 정의되어 있다.
new키워드를 통해 인스턴스를 생성할 수 있다.
순서 및 관계
클래스 ㅡ> 인스턴스 생성 ㅡ> 참조변수(주소저장)
new키워드 : 객체를 생성할 때 사용하는 키워드, 클래스의 인스턴스를 메모리 위에 할당한다.
인스턴스
클래스(설계도)를 기반해 생성된 객체로 클래스의 속성(변수)과 메서드를 사용할 수 있다.
인스턴스는 여러 개가 존재할 수 있으며 클래스의 속성(변수)과 메서드를 공유하지만, 각 인스턴스마다 독립적인 값을 가질 수 있다.
클래스가 자동차의 설계도라 생각했을 때, 인스턴스는 공장에서 만들어진 자동차라고 생각하면 이해하기 쉽다.
인스턴스(객체) 생성방법
1. 단계별 생성
클래스명 변수명;
변수명 = new 클래스명();
2. 한번에 생성
클래스명 변수명 = new 클래스명();
참조변수
객체지향을 위한 변수.
객체의 인스턴스를 참조하는 변수로 객체의 주소를 저장하며, 이를 통해 객체의 속성(변수)과 메서드에 접근할 수 있다.
위에서 설명한 자동차의 키 같은 개념이라 생각하면 된다. 자동차 키가 있어야 자동차를 타고 운전할 수 있으며, 그 안에 있는 기능(메서드)들을 사용할 수 있다.
참조변수로 인스턴스에 접근하는 방법
1. 인스턴스에 접근
변수에 접근 : 참조변수.변수명;
메서드 실행 : 참조변수.메서드명();
2. 클래스 멤버일 경우
변수에 접근 : 클래스명.변수명;
메서드 실행 : 클래스명.메서드명();
예시
public class car {
boolean powerOn;
String color;
int wheel;
int speed;
boolean wiperOn;
void power() {powerOn = !powerOn;}
void speedUp() {speed++;}
void speedDown() {speed--;}
void wiper() {wiperOn = !wiperOn;}
}
public static void main(String[] args) {
car mycar = new car();
System.out.println("시동 처음 초기화" + mycar.powerOn);
System.out.println("차의 색상 초기화" + mycar.color);
System.out.println("바퀴의 갯수 초기화" + mycar.wheel);
System.out.println("속력 초기화" + mycar.speed);
System.out.println("와이퍼 작동 초기화" + mycar.wiperOn);
mycar.power();
System.out.println("시동 메서드 동작" + mycar.powerOn);
mycar.power();
System.out.println("시동 메서드 재동작" + mycar.powerOn);
mycar.speedUp();
System.out.println("속력 상승" + mycar.speed);
mycar.color = "black";
System.out.println("차량 색상 변경" + mycar.color);
car mycar2 = new car();
mycar2.color = "red";
mycar2.wheel = 10;
mycar2.speed = 200;
System.out.println(mycar2.color);
System.out.println(mycar2.wheel);
System.out.println(mycar2.speed);
mycar2.power();
mycar2.speedUp();
System.out.println(mycar2.speed);
System.out.println(mycar2.powerOn);
}
car 클래스를 기반으로 인스턴스를 생성하여 mycar변수에 그 주소를 저장한다.
참조변수에 인스턴스의 주소를 저장했으니 이제 car클래스의 속성과 기능을 mycar변수를 통해 사용할 수 있다.
참조변수에는 비교 연산자를 사용할 수 없다.
객체의 주소를 저장하고 있는 참조변수의 값을 비교 연산자를 사용해 비교하면 두 변수의 메모리 주소를 비교하기 때문에 두 변수가 동일한 인스턴스를 참조하고 있지 않는 이상 false가 결괏값이 된다.
따라서 문자열이나 객체의 실제 내용을 비교할 때는 equals()메서드를 사용해야 한다.
equals() 메서드는 객체의 실제 내용을 비교하여 결괏값을 반환한다.
변수
인스턴스 변수
인스턴스를 생성할 때마다 만들어지며, 여러개가 존재할 수 있다.(수동생성)
인스턴스는 고유의 저장공간(주소)을 갖고 있기 때문에 인스턴스 변수는 각 인스턴스마다 독립적인 값을 가질 수 있다.
인스턴스가 생성되었을 때부터 접근 가능하다.
접근방법
참조변수.변수명;
*인스턴스 변수에는 클래스 이름으로 접근이 불가능하다.
클래스 변수
모든 인스턴스가 공통된 값을 공유하는 변수로, 클래스가 처음 메모리에 로딩될 때 생성된다.(자동생성)
ex) 자동차는 바퀴가 4개다.
인스턴스 변수 앞에 static 키워드를 작성해 사용한다.
인스턴스 변수와 다르게 여러개의 인스턴스가 생성되어도 하나의 변수만 존재한다.
접근방법
클래스이름.변수명;
*클래스 변수(static)는 참조변수로 접근이 가능하나, 클래스 변수는 공통된 값을
공유하는 변수이기 때문에 변경된 값이 모든 인스턴스에 적용된다.
예를 들어 동일한 클래스의 인스턴스가 저장된 참조변수 a와 b가 있을 때 a로 클래스 변수 c에 접근해 c의 값을 변경시키면 b를 통해 접근한 c의 값도 변경된다.
쉽게 생각하면 자동차 바퀴가 4개에서 5개로 늘어났다고 생각하면 된다.
static키워드
클래스에 미리 만들어지게 하는 선언 키워드
변수 선언
- static 키워드로 선언된 변수는 모든 인스턴스가 값을 공유한다.
메서드 선언
- static 키워드로 선언된 메서드는 모든 인스턴스가 메서드를 공유한다.
- 인스턴스 없이 클래스 이름으로 호출 가능하며, 인스턴스 변수에 접근할 수 없다.
메서드
객체가 가지고 있는 기능을 의미하며, 객체를 통해 호출되면 실행된다.
사용법
반환타입 메서드명 (타입 변수명, 타입 변수명,...){
//메서드의 내부 동작
return 값;
}
클래스명.메서드명(숫자or문자or변수, 숫자or문자or변수); //호출
작성순서(중요!)
- 반환타입 지정(중요!!!!)
- 매개변수 지정(타입과 변수명)
- 내부동작
- 리턴(반환타입이 void가 아닐 경우)
예시
public class cc {
static int aa( int a, int b ) {
return a*b;
}
}
int bb = cc.aa(10, 5);
클래스 cc의 메서드 aa를 호출하여 인수로 10과 5를 넘기면, aa메서드는 10과 5를 곱하여 50을 반환하고 그 값이 변수 bb에 저장된다.
이때 10은 int a, 5는 int b의 파라미터에 할당된다.
용어 정리
반환타입 | 정수(int), 실수(float), 논리(boolean), 문자(char), 참조 등 메서드의 반환하는 값의 데이터 타입을 정한다. |
메서드명 | 자유롭게 작명 가능하며, 소문자로 시작하는 것이 일반적이다. |
매개변수 | 메서드명 뒤 괄호 안에 위치하며, 데이터 타입과 변수명으로 이루어져 있다. |
파라미터 | 함수나 메서드의 정의에서 사용되는 변수로, 호출될 때 전달받는 인수를 받는 역할을 한다. |
void | 메서드에 반환하는 값이 없는 경우 사용되는 반환타입이다. |
return | 결과 값을 반환하는 역할을 한다. 반환타입이 void인 경우를 제외하고는 메서드 내부에 return문이 반드시 포함되어 있어야 한다. |
클래스 멤버와 인스턴스 멤버 간의 참조 및 호출
클래스 멤버 = 클래스 변수, 클래스 메서드
인스턴스 멤버 = 인스턴스 변수, 인스턴스 메서드
클래스 멤버 ㅡ> 인스턴스 멤버 (불가능)
인스턴스 멤버 ㅡ> 클래스 멤버 (가능) ==> 객체 생성 이후에 존재하기 때문
클래스 멤버 ㅡ> 클래스 멤버 (가능)
인스턴스 멤버 ㅡ> 인스턴스 멤버 (가능) ==> 객체 생성 이후에는 둘 다 사용 가능하기 때문
예시
public class check {
//instanceVariable : iv
// classVariable : cv
//instanceMathod : im
// classMathod : cm
static int cv = 5; //클래스 변수
int iv = 4; //인스턴스 변수
static void cm() { //클래스 매서드
}
void im() { //인스턴스 매서드
}
//이미 존재(클래스) ㅡㅡ> 없는 존재(인스턴스)
static void cm_Imember() {
//클래스 매서드가 인스턴스 매서드에 접근
//System.out.println(iv); //에러발생
//im(); //에러발생
}
// new(객체 생성) 이후 존재(인스턴스) ㅡ> 이미 존재(클래스)
void im_Cmember() {
//인스턴스 메서드가 클래스 메서드에 접근
System.out.println(cv);
cm();
}
//이미 존재 ㅡㅡ> 이미 존재
static void cm_Cmember() {
//클래스 메서드가 클래스 멤버에 접근
System.out.println(cv);
cm();
}
//없는 존재 ㅡㅡ> 없는 존재 (객체 생성 이후에는 둘 다 사용가능해짐)
void im_Imember() {
//인스턴스 메서드가 인스턴스 멤버에 접근
System.out.println(iv);
im();
}
}
package object_test;
public class exam_37 {
public static void main(String[] args) {
//check.cm_Imember(); //에러
check.cm_Cmember(); //성공
check myinstance = new check();
myinstance.im_Cmember(); //성공
myinstance.im_Imember(); //성공
}
}
클래스 멤버에서 인스턴스 멤버로 접근할 때만 오류가 발생한다.
클래스 멤버는 클래스가 생성되었을 때부터 메모리에 존재하지만 인스턴스 멤버는 객체가 생성되어야 존재하는 상태가 되기 때문에 오류가 발생하는 것이다.
클래스 멤버는 존재하지 않는 친구를 찾고 있다...
오버로딩
겹겹이 쌓는 것을 의미하며, 일반적으로 사용이 불가능한 동일한 이름을 가진 여러 메서드를 정의하여, 매개변수의 데이터 타입과 개수로 구분하는 것을 의미한다.
즉, 메서드의 이름이 같더라도 매개변수의 타입이나 개수가 다르면 서로 다른 메서드로 인식된다.
예시
static int sum(int a, int b){}
static int sum(int a, int b, int c) {}
double sum(double a, double b) {}
이 세 개의 메서드들은 이름은 같지만 서로 다른 메서드다.
첫 번째 sum은 두 개의 int를 매개변수로 받고,
두 번째 sum은 세 개의 int를 매개변수로 받는다.
세 번째 sum은 두 개의 double을 매개변수로 받는다.
생성자
객체를 생성할 때 호출되는 메서드로 인스턴스 변수를 초기화할 때 사용된다.
생성자를 사용하면 객체가 생성될 때 인스턴스 변수를 초기화할 수 있다.
특징
1. 함수의 이름이 클래스와 동일하다.
2. 생략하면 기본 생성자가 자동으로 등록된다.
3. 반환타입이 존재하지 않는다(데이터타입, void 없음)
왜 사용하는가?
참조변수를 사용해 초기화를 하는 것 보다 더 간편하게 인스턴스 변수를 초기화할 수 있다.
기본 생성자
매개변수가 없는 생성자를 의미한다.
클래스에 기본 생성자를 정의하지 않으면, 자동으로 기본 생성자가 등록된다.
이 경우, 기본 생성자는 아무 작업도 수행하지 않는다.
예시
클래스 내부
클래스명() {
//필요작업
}
매개변수 생성자
클래스 내부에 매개변수를 받는 생성자를 의미한다.
매개변수가 있는 생성자가 정의되면, 더 이상 기본 생성자가 자동으로 생성되지 않으며, 인스턴스를 생성할 때 매개변수의 값을 반드시 제공해야한다. (안 그럼 오류난다.)
예시
클래스명(매개변수1, 매개변수2) {
this.변수1 = 매개변수1;
this.변수2 = 매개변수2;
}
클래스명 변수명 = new 클래스명(값1, 값2);
this : 전역변수를 지정한다.
'Back_end > JAVA' 카테고리의 다른 글
JAVA - Package와 import (0) | 2024.09.19 |
---|---|
JAVA - 상속 (0) | 2024.09.19 |
JAVA - 배열 (0) | 2024.09.09 |
JAVA - 제어문(반복문) (0) | 2024.09.07 |
JAVA - 제어문(조건문) (0) | 2024.09.06 |