반응형
클래스(class)
- 객체를 만들 수 있는 설계도를 의미한다.
- 객체란 자신을 표현하는 데이터(속성,필드)를 가지며 자신이 할 수 있는 행위(기능,메소드)를 가지는 실제 데이터를 의미한다.
- 객체는 반드시 참조되어 있어야 사용할 수 있다.(변수 등)
- 객체를 담는 변수는 "클래스변수"라고 한다.
- 객체를 담는 변수의 타입은 객체를 생성하는 클래스이다.
- 객체 생성할 때 반드시 new 클래스(); 를 사용하여 생성한다.
1)물리적 객체
- 실제 존재할 수 있는 객체이며 속성과 기능을 가질 수 있다.
2)추상 객체
- 실제 객체들의 개념(그룹)에 해당하는 객체를 의미하며 실제 존재할 수 없다.
자바는 class를 사용하여 필요한 객체를 생성 후 조립하여 하나의 시스템을 만들어 낸다.
클래스 선언 방법!
- 자바 식별자 규칙을 지켜 클래스 이름을 짓는다.
- public 키워드가 있는 class는 반드시 소스파일과 클래스 이름이 같아야 한다.
- 클래스 명은 중복 선언할 수 없다.
- 하나의 소스파일에는 여러 클래스를 선언할 수 있다.
- public 키워드는 한번만 사용할 수 있다.
- 하나의 소스파일에 클래스 여러개 선언 시 컴파일되는 클래스를 클래스 갯수만큼 생성된다.
문법)
[public] class 클래스이름 {
//구성요소
}
필드
- 객체를 표현하는 데이터를 담는 그릇을 의미
- 필드선언 : 데이터타입 필드명[=초기값];
- 객체의 필드에 접근하기 위해서는 반드시 객체부터 생성해야한다.
- 초기값이 존재하는 필드는 생성되는 모든 객체의 해당 필드의 초기값을 갖는다.
- 초기값이 존재하지 않는 필드는 생성되는 모든 객체의 해당 필드는 정수는 0, 실수는 0.0, 논리는 false, 참조는 null로 초기화된다.
생성자
- 클래스 내부에 생성
- new 클래스(); -> 생성자 호출
- 기본 생성자 : 단순히 객체를 생성하는 역할만 한다
- 소스코드에서 생성자를 누락하는 경우 컴파일러가 반드시 기본 생성자를 추가하여 클래스 파일을 생성한다.
- 소스코드에서 생성자가 단 하나라도 존재한다면 컴파일러는 기본생성자를 추가하지 않는다.
- 매개값 : 호출할때 보내는 데이터
- 매개변수 : 호출할때 보내는 데이터를 받는 변수
- this는 현재 생성되는 객체(필드)를 의미하는 키워드
- this() : 생성자 호출
생성자 오버로딩
- 하나의 클래스에서 생성자를 여러개 선언하는 문법!
- 객체를 생성하는 방법이 다양해질 수 있다.
규칙!
- 생성자의 매개변수 선언은 동일하게 존재할 수 없다.
- 생성자의 매개변수 타입, 갯수, 순서는 각각 생성자마다 달라야한다.
public class Person {
//필드
String nation = "한국"; //만들어지는 모든 Person 타입 객체의 nation은 한국이다.
String name;
int age;
String address;
//기본 생성자 : 단순히 객체를 생성하는 역할만 한다
Person(){
System.out.println("Person객체 생성");
}
/*
생성자 오버로딩
1.이름과 주소를 초기화
2.이름 나이 주소를 초기화
*/
Person(String name, String address){
this.name = name;
this.address = address;
}
Person(String name, String address, int age){
this.name = name;
this.address = address;
this.age = age;
}
}
public class Sample {
String data1;
int data2;
Sample(){
this("생성자 호출"); //문자열 1개를 가지고 있는 Sample(String arg) 생성자 호출하는것
}
Sample(String arg){
data1 = arg;
}
Sample(String arg1,int arg2){//생성자가 호출될때 반드시 문자열 값 하나를 받겠다.
System.out.println("생성자출력> " + arg1);
System.out.println("생성자출력> " + arg2);
data1 = arg1; //매개변수 arg1의 값을 필드 data1에 초기화
//data2 필드의 초기값을 생성자 매개변수 arg2로 초기화
data2 = arg2;
}
public static void main(String[] args) {
//매개값 : 호출할때 보내는 데이터
//매개변수 : 호출할때 보내는 데이터를 받는 변수
Sample sample01 = new Sample("안녕",10);
System.out.println(sample01.data1);
System.out.println(sample01.data2);
System.out.println("----------------");
Sample sample02 = new Sample();
System.out.println(sample02.data1);
}
}
실행결과)
메소드
- 기능.객체가 할 수 있는 일
- 객체를 통해 사용할 수 있는 기능을 의미한다.
- 기능은 호출될 이름이 필요하며 외부에서 값을 보낼 수 있다
- 외부에서 보낸 값을 통해 연산 또는 처리 결과를 호출한 곳으로 돌려줄수도 있다.
- return은 호출한 곳으로 값을 반환도 하지만 메소드를 강제종료도 할 수 있다
- return 키워드 아래로는 실행문이 들어올 수 없다.
- if문을 사용하여 주로 메소드를 강제 종료하는 경우 사용된다.
문법)
리턴타입 메소드명([매개변수, ...]){
실행문1
...
실행문n
[return 리턴값]
}
public class MemberService {
boolean login(String id, String password) {
if(id.equals("hong") && password.equals("12345")) {
return true;
}
return false;
}
void logout(String id) {
System.out.println(id + "님이 로그아웃 되었습니다");
}
public static void main(String[] args) {
MemberService memberService = new MemberService();
boolean result = memberService.login("hong", "12345");
if(result) {
System.out.println("로그인 되었습니다");
memberService.logout("hong");
}else {
System.out.println("id 또는 password가 올바르지 않습니다");
}
}
}
메소드 오버로딩
- 같은 메소드명으로 매개변수의 타입, 갯수, 순서 다르게 여러개 선언하는 문법을 의미
- 같은 이름의 메소드를 호출할 수 있는 방법이 다양해지며 결과값도 다양해진다.
public class Calculator {
//정사각형의 넓이
double areaRectangle(double width) {
return width * width;
}
//직사각형의 넓이
double areaRectangle(double width,double height) {
return width * height;
}
}
public class Printer {
void println(int value) {
System.out.println(value);
}
void println(boolean value) {
System.out.println(value);
}
void println(double value) {
System.out.println(value);
}
void println(String value) {
System.out.println(value);
}
public static void main(String[] args) {
Printer p = new Printer();
p.println(10);
p.println(true);
p.println(5.7);
p.println("홍길동");
}
}
public class Employee {
String company = "(주)00"; //회사명
String num; //사번
String name; //사원명
String division; //부서명
String tel; //연락처
String addr; //주소
String birth; //생년월일
//사번을 초기화
Employee(String num) {
this.num = num;
}
//사번,부서명,사원명을 초기화
Employee(String num, String division,String name) {
this.num = num;
this.division = division;
this.name = name;
}
void print() {
System.out.println("회사명:" + company);
System.out.println("사원번호:" + num);
System.out.println("사원명:" + name);
System.out.println("부서명:" + division);
System.out.println("연락처:" + tel);
System.out.println("주소:" + addr);
System.out.println("생년월일:" + birth);
}
}
public class EmployeeService {
Employee employee;
//사원 등록
void insert(Employee employee) {
this.employee = employee;
System.out.println("등록이 완료 되었습니다.");
}
//사원 삭제
void delete() {
employee = null;
}
//사원 조회
void select() {
if(employee == null) {
System.out.println("등록된 사원이 없습니다.");
return;
}
employee.print();
}
//사원명 수정
void modify(String name) {
if(employee == null) {
System.out.println("등록된 사원이 없습니다.");
return;
}
employee.name = name;
System.out.println("사원명 수정이 완료 되었습니다.");
}
//부서명,연락처 수정
void modify(String division,String tel) {
if(employee == null) {
System.out.println("등록된 사원이 없습니다.");
return;
}
employee.division = division;
employee.tel = tel;
System.out.println("부서명,연락처 수정이 완료 되었습니다.");
}
//연락처,주소,생년월일 수정
void modify(String tel,String addr,String birth) {
if(employee == null) {
System.out.println("등록된 사원이 없습니다.");
return;
}
employee.tel = tel;
employee.addr = addr;
employee.birth = birth;
System.out.println("연락처,주소,생년월일 수정이 완료 되었습니다.");
}
}
public class Main {
public static void main(String[] args) {
Employee employee = new Employee("001"); //EmployeeService의 부품
EmployeeService es = new EmployeeService();
System.out.println(es.employee); //null
es.insert(employee);
System.out.println(es.employee); //주소값
System.out.println(employee); //같은 주소값
employee.name = "홍길동";
//es.insert(employee) 로 employee의 주소가 es로 들어갔기 때문에
//같은 주소를 참조하는 참조상태이기 때문에 홍길동이 나옴
System.out.println(es.employee.name);
es.modify("홍길민");
System.out.println(employee.name);
es.modify("교육부", "010-1111-1111");
es.select();
System.out.println("---------------");
employee.print();
es.delete();
System.out.println("---------------");
es.select(); //등록된 사원이 없습니다. 로 나옴
System.out.println("---------------");
employee.print(); //기존 정보 그대로 출력됨
}
}
붕어빵 틀
필드 : 속재료 반죽 모양
데이터 : 슈크림 밀가루 붕어
메소드 : 뒤집는다 열린다 닫힌다
생성자 : 굽는다
객체 : 필드(속성)과 메소드(동작)을 갖는 데이터
필드 : 그 객체를 표현하는 실질적인 데이터
메소드 : 그 객체가 할 수 있는 행위, 기능
캡슐화
-정보은닉과 관련 있음
-접근제한자를 사용
상속
-부모가 가지고 있는 필드와 메소드를 자식 객체에서 물려줌
-소스코드의 중복을 방지할 수 있음
다형성
-똑같은 호출인데 어떤 객체가 들어오냐에 따라 결과가 달라짐
클래스
- 설계도(붕어빵 틀 역할)
- 하나의 클래스로부터 여러개의 인스턴스를 만들 수 있음
인스턴스
- 클래스로부터 생성된 객체를 해당 클래스의 인스턴스라고 함
반응형
'Java' 카테고리의 다른 글
[Java] 상속, 메소드 오버라이딩, 추상클래스 (0) | 2024.08.03 |
---|---|
[Java] 인스턴스 멤버, 정적 멤버, 정적 필드, 정적 메소드, 상수, 패키지, 접근제한자, 싱글톤 (0) | 2024.08.01 |
[Java] 배열, 향상된 for문, 열거 (0) | 2024.07.29 |
[Java] String, String이 제공하는 기능들 (0) | 2024.07.28 |
[Java] null, NullPointerException, 참조타입 (0) | 2024.07.27 |