예제)
class Character {
String name;
int level;
void showInfo() {
System.out.println(name + " / " + level);
}
}
Character라는 것을 만들 건데,
이름과 레벨을 가지고 있고,
자기 정보를 보여줄 수 있다.
class Character {
String name;
int level;
}
이건 캐릭터 한 명을 만든 게 아니고,
그냥 캐릭터를 어떻게 만들 것인지 적어놓은 설명서이다.
마치 게임 개발자가 캐릭터는 이름이 있어야 하고, 레벨이 있어야 한다고 정해놓은 것.
Character c = new Character();
여기서 드디어 실제 캐릭터 하나가 만들어진다.
new를 통해 실제로 만들어진 하나라고 생각하면 됨.
c ──────────→ 🧑 캐릭터 하나
c는 캐릭터 자체가 아니라 그 캐릭터를 찾아갈 수 있는 변수이다.
참조변수는 "저 캐릭터(객체) 가리키고 있는 변수"라고 생각하면 됨.
String name;
int level;
Character라는 클래스의 멤버로 들어가 있는 변수이기 때문에 멤버변수.
Character 객체
┌──────────────────┐
│ name = ??? │ ← 멤버변수
│ level = ??? │ ← 멤버변수
└──────────────────┘
쉽게 말하면 객체가 가지고 있는 데이터.
class Student {
// ⭐ 멤버변수 (필드)
String name;
int age;
// ⭐ 매개변수 (parameter)
Student(String name, int age) {
this.name = name;
this.age = age;
}
void introduce(String message) {
// message → 매개변수
System.out.println(name + " : " + message);
}
}
public class Main {
public static void main(String[] args) {
// ⭐ 참조변수
Student student = new Student("하루", 20);
student.introduce("안녕하세요!");
}
}
구분 코드 의미 멤버변수 String name객체가 가지고 있는 데이터 int age매개변수 String name메서드/생성자에 값을 전달받는 변수 int ageString message메서드가 호출될 때 전달받는 변수 참조변수 Student student객체의 주소(참조)를 저장하는 변수
Student student = new Student("하루", 20);
↑
참조변수
student는 Student 객체를 가리키는 참조변수!
new Student("하루", 20)
이때 "하루"와 20이 생성자(객체(Student)를 만들 때 어떤 값("하루", 20)을 넣어줄지 정하는 코드)에 전달된다.
this.name = name;
"이 객체의 멤버변수 name(왼)에, 매개변수 name(오)의 값을 넣어라."
Character c = new Character();
c.name = "리쿠";
c.level = 10;
Car c = new Car();
c.color = "빨강";
c.price = 1000;
생성자를 사용하지 않으면 객체 만들 때마다 이렇게 비효율적으로 만들어야 함.
class Character {
String name;
int level;
Character(String name, int level) {
this.name = name;
this.level = level;
}
}
그래서 생성자를 만들어서 하면 효율적임.
이 예제에서는 캐릭터(객체)를 만들 때 어떤 값(이름, 레벨)을 넣어줄지 정하는 코드.
Car c = new Car("빨강", 1000);
만드는 순간 이렇게 값까지 넣을 수도 있음.
그래서
name.length();
name → 문자열 객체
length() → 그 문자열이 가지고 있는 기능. 기능의 이름
() → 그 기능을 실행한다
=> "name아, 너 길이 좀 알려줘!"
예제)
Student(String name, int age) {
this.name = name;
this.age = age;
}
this. name : 객체가 가지고 있는 name
name : 생성자를 호출할 때 전달받은 name
→ "이 객체의 name에 전달받은 name을 넣어라."
Student s = new Student("유우시", 20);
new Student(...)
↓
Student 객체 생성
↓
생성자 실행
↓
name = "유우시"
age = 20
class Student {
String name;
void setName(String name) {
name = name;
}
}
name = name
↑ ↑
??? ???
JAVA 입장에서는 둘 다 똑같은 name.
멤버변수 name인지, 매개변수 name인지 구분할 수가 없다!
그래서 this를 붙이는 것!
class Student {
String name;
void setName(String n) {
name = n;
}
}
name → 객체의 멤버변수
n → 매개변수
위의 예제와 같이 이름이 겹치지 않는다면 항상 필요한 것은 아니다.