728x90
객체(object)
우리가 표현할 수 있는 실제 세계의 모든 사물들
개념적인 객체 | 물리적인 객체 |
동물 | 개, 고양이, 호랑이, 곰 |
자동차 | 소나타, K5, SM5 |
클래스
프로그래밍에서 객체와 관련된 데이터와 처리 동작을 한데 모은 코드 뭉치
추상화 : 특징적인 데이터와 처리 동작을 추려내는 과정
- 명사적인 특징을 뽑아내는 추상화 과정 → 멤버 변수(필드) 추출
- 동사적인 특징을 뽑아내는 추상화 과정 → 멤버 함수(메서드) 추출
객체 | 목적 구분 | 객체 구분 | 추상화된 클래스 모델 |
탈 것 | 개인, 이륜 | 자전거, 오토바이 | Bike |
자동차 | 승용차, 버스, 트럭 | Car | |
운송 수단 | 자동차, 배, 비행기 | Vehicle |
// 클래스 정의
class Npc
{
// 필드 - 데이터
String name;
int hp;
// 메서드 - 동작
void say()
{
System.out.println("안녕하세요.");
}
}
public class NpcUse
{
public static void main(String[] args) {
// 클래스를 이용해 객체 생성
// - 'NPC'란 설계도(클래스)를 이용해 NPC 객체 만들기
// 클래스 타입의 변수는 new 를 통해 객체를 생성한다.
// 클래스 타입의 참조 변수는 스택에, 생성된 객체는 힙에 적재된다.
Npc saram1 = new Npc();
// 필드 접근
saram1.name = "경비";
saram1.hp = 100;
System.out.println(saram1.name + ":" +
saram1.hp);
// 메서드 호출
saram1.say();
}
}
//객체 만들기
//현실 --> 만들어진 자동차가 실제로 눈 앞에 보임
//컴퓨터 --> 객체를 메모리에 적재
객체와 클래스
클래스는 객체를 프로그래밍에서 사용하려고 추상화해서 기술해놓은 설계도
프로그래밍에서 사용하려면 설계도를 기초로 실체를 만들어야 함
- 실체화 된 것 = 객체(object)
- 실체화하는 작업 = '객체(object)를 생성한다' or '인스턴스화한다(instantiate)'
소프트웨어 세계에서 객체는 클래스라는 설계도대로 구현한 것을 메모리에 탑재해 메모리 주소를 부여한 것
설계도 | 객체 생성(인스턴스화) | 실물 | |||
실생활 | 자동차 설계도 | → | 공장 | → | (생성된) 자동차 |
프로그래밍 | 클래스 | → | new | → | (메모리에 적재된) 값 |
Book myBook = new Book();
class Npc
{
String name;
int hp;
void say()
{
System.out.println("안녕하세요.");
}
}
public class NpcUse
{
public static void main(String[] args)
{
Npc saram1 = new Npc();
saram1.name = "경비";
saram1.hp = 100;
System.out.println(saram1.name + " : " + saram1.hp);
saram1.say();
}
}
(new를 통해 새로 만들어지는 객체에서 사용하는 메서드에는 static을 붙이지 않음)
- 객체 생성에 new 연산자 사용
- 다른 객체의 멤버에는 .을 이용하여 접근
오버로딩
하나의 클래스 내에 매개변수 개수나 자료형은 다르지만 메서드명은 같은 메서드를 여러 개 정의하는 것
동일하거나 유사한 일을 수행하는 메서드가 전달받는 매개변수에 따라 각기 다른 연산을 하는 경우 유용함
class Calc
{
int add(int a, int b)
{
return a + b;
}
int add(int a)
{
return a + 1;
}
double add(double a, double b)
{
return a + b;
}
}
public class OverloadingUse
{
public static void main(String[] args)
{
Calc calc = new Calc();
int nRtn1 = calc.add( 3, 9 );
int nRtn2 = calc.add( 3 );
double nRtn3 = calc.add( 3.0, 9.0 );
System.out.println("Rtn1 = " + nRtn1);
System.out.println("Rtn2 = " + nRtn2);
System.out.println("Rtn3 = " + nRtn3);
}
}
System.out.println(); //매개변수 없이 줄바꿈만 출력
System.out.println(1); //정숫값 출력
System.out.println("홍길동"); //문자열 출력
생성자(constructor)
객체 생성을 할 때만 호출하는 특수한 메서드
new 연산자가 객체의 생성자를 이용하여 객체를 생성
생성자의 특징
- 생성자명 = 클래스명
- 메서드이지만 반환형이 없는 형태
디폴트 생성자 : 클래스를 정의할 때 생성자를 기술하지 않으면 매개변수가 없는 생성자가 자동으로 만들어짐
- 생성자명 = 클래스명
- 메서드이지만 반환형이 없는 형태
- 매개변수가 없음
- 수행하는 기능 없음
class Book
{
Book()
{
}
}
class Book
{
String title;
int price;
int num = 0;
// 디폴트 생성자에 기능 부여
Book()
{
title = "자바 프로그래밍";
price = 30000;
}
// 생성자의 오버로딩
Book(String t, int p)
{
title = t;
price = p;
}
void print()
{
System.out.println("제 목 : " + title);
System.out.println("가 격 : " + price);
System.out.println("주문수량 : " + num);
System.out.println("합계금액 : " + price * num);
}
}
public class ConstructorUse
{
public static void main(String[] args)
{
Book book1 = new Book();
book1.print();
Book book2 = new Book("자바 디자인패턴", 35000);
book2.num = 10;
book2.print();
}
}
접근 제한자
접근 제한자 | 설명 |
public | 외부 클래스 어디에서나 접근 가능 |
protected | 같은 패키지 내부와 상속 관계의 클래스에서만 접근 가능 |
(아무 표시X) | 디폴트, 같은 패키지 내부에서만 접근 가능 |
private | 같은 클래스 내부에서만 접근 가능 |
(패키지 = 클래스가 위치한 폴더)
정보 은닉화 : private을 적용하여 클래스 외부에서 클래스 내부로의 변수와 메서드에 대한 접근 제한
getter : private 멤버 변수로부터 값을 가져오는 메서드
setter : private 멤버 변수에 값을 대입하는 메서드
class Student1
{
String name; //default
int age; //default
}
class Student2
{
public String name;
private int age;
public Student2(String name, int age)
{
this.name = name;
this.age = age;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
if (age < 0 || age > 150)
{
System.out.println("나이가 부적절합니다.");
this.age = 0;
return;
}
this.age = age;
}
}
public class PrivateUse
{
public static void main(String[] args)
{
Student1 student1 = new Student1();
student1.name = "홍길동";
student1.age = -20;
System.out.printf("%s의 나이는 %d살입니다.\n",
student1.name, student1.age);
Student2 student2 = new Student2("전우치", 20);
student2.name = "손오공";
//student2.age = -10;
student2.setAge(-10);
int age = student2.getAge();
System.out.printf("%s의 나이는 %d살입니다.\n",
student2.name, age);
}
}
'JAVA > 이재환의 자바 프로그래밍 입문' 카테고리의 다른 글
[Java] Ch.11 스태틱의 이해 (1) | 2023.10.20 |
---|---|
[Java] Ch.10 자바의 메모리 모델 (1) | 2023.10.17 |
[Java] Ch.8 계산기 만들기 (0) | 2023.10.16 |
[Java] Ch.7 메서드와 변수의 사용 가능 범위 (0) | 2023.10.16 |
[Java] Ch.6 제어문 (1) | 2023.10.16 |