1. 객체 지향 프로그래밍
▷ 객체(object) : 물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것입니다.
▷ 객체는 속성과 동작으로 구성합니다. 자바는 이러한 속성과 동작을 각각 필드와 메소드라고 합니다.
◎ 객체 지향 프로그래밍(OOP) : 객체들을 먼저 만들고 이 객체들을 하나씩 조립해서 완성된 프로그램을 만드는 기법입니다.
◎ 객체의 상호 작용
▷ 객체 지향 프로그램에서도 객체들은 다른 객체와 서로 상호작용하면서 동작합니다.
▷ 객체가 다른 객체의 기능을 이용할 때 이 메소드를 호출해 데이터를 주고 받습니다.
▷ 매개값 : 객체가 전달하고자 하는 데이터이며, 메소드 이름과 함께 괄호() 안에 기술합니다.
▷ 리턴값 : 메소드의 실행 결과이며, 호출한 곳으로 돌려주는 값입니다.
◎ 객체 간의 관계
▷ 집합 관계 : 완성품과 부품의 관계입니다.
▷ 사용 관계 : 다른 객체의 필드를 읽고 변경하거나 메소드를 호출하는 관계입니다.
▷ 상속 관계 : 부모와 자식 관계. 필드, 메소드를 물려받습니다.
◎ 객체 지향 프로그래밍의 특징
▷ 캡슐화 : 객체의 데이터(필드), 동작(메소드)을 하나로 묶고 실제 구현 내용을 외부에 감추는 것입니다.
▷ 상속 : 부모 객체가 자기 필드와 메소드를 자식 객체에게 물려줘 자식 객체가 사용할 수 있게 합니다.
→ 코드 재사용성을 높이고 유지 보수 시간을 최소화합니다.
▷ 다형성 : 사용 방법은 동일하지만 실행 결과가 다양합니다.
2. 클래스와 인스턴스
▷ 객체 지향 프로그래밍에서도 객체를 생성하려면 설계도에 해당하는 클래스가 필요합니다.
▷ 클래스로부터 생성된 객체를 해당 클래스의 인스턴스라고 부릅니다.
▷ 클래스로부터 객체를 만드는 과정을 인스턴스화라고 합니다.
▷ 동일한 클래스로부터 여러 개의 인스턴스를 만들 수 있습니다.
▶ 동일한 모델이지만 인스턴스는 다릅니다.(번호판)
3. 클래스 선언
▷ 객체를 생성(생성자)하고, 객체가 가져야 할 데이터(필드)가 무엇이고, 객체의 동작(메소드)은 무엇인지를 정의합니다.
▷ 클래스 선언은 소스 파일명과 동일하게 작성합니다.
▷ 클래스명은 첫 문자를 대문자로 하고 캐멀 스타일로 작성합니다.
▶ 숫자를 포함해도 되지만 첫 문자는 숫자가 될 수 없고, 특수 문자 중 $, _를 포함할 수 있습니다.
▷ 공개 클래스 : 어느 위치에 있든지 패키지와 상관없이 사용할 수 있는 클래스입니다.
▶ print, math, Scanner 등등
4. 클래스 변수
▷ 클래스로부터 객체를 생성하려면 객체 생성 연산자인 new가 필요합니다.
▷ new 연산자는 객체를 생성시키고 객체의 주소를 리턴합니다.
▷ 라이브러리 클래스 : 실행할 수 없으며 다른 클래스에서 이용하는 클래스입니다.
▷ 실행 클래스 : main() 메소드를 가지고 있는 실행 가능한 클래스입니다.
5. 클래스 구성 멤버(생성자, 필드, 메소드)
▷ 필드(변수) : 객체의 데이터를 저장하는 역할입니다. 선언 형태는 변수 선언과 비슷하지만 쓰임새는 다릅니다.
▷ 생성자 : new 연산자로 객체를 생성할 때 객체의 초기화 역할입니다.
선언 형태는 메소드와 비슷하지만, 리턴 타입이 없고 이름은 클래스 이름과 동일합니다.
▷ 메소드(함수) : 객체가 수행할 동작입니다. 함수라고도 불립니다.
6. 필드 선언과 사용
▷ 필드는 클래스 블록에서 선언되어야 합니다.
▷ 타입은 필드에 저장할 데이터의 종류를 결정합니다. 기본 타입, 참조 타입 모두 가능합니다.
▷ 초기값을 제공하지 않을 경우 필드는 객체 생성 시 자동으로 기본값으로 초기화합니다.
▷ 필드 사용 : 필드 값을 읽고 변경하는 것입니다. 클래스로부터 객체가 생성된 후에 필드를 사용할 수 있습니다.
▷ 필드는 객체 내부의 생성자와 메소드 내부에서 사용할 수 있고, 객체 외부에서도 접근해서 사용할 수 있습니다.
◎ 클래스 사용 예제
public class Car { //필드 선언 String model; boolean start; int speed; }
public class CarExample { public static void main(String[] args) { // Car 클래스를 이용하여 myCar 객체 생성 Car myCar = new Car(); System.out.println("모델명 : " + myCar.model); System.out.println("시동여부 : " + myCar.start); System.out.println("현재속도 : " + myCar.speed); } } // 출력 : // 모델명 : null // 시동여부 : false // 현재속도 : 0
◎ 클래스 사용 예제2
public class Car { //필드 선언 String company = "현대자동차"; String model = "그랜저"; String color = "검정"; int maxSpeed = 350; int speed; }
public class CarExample { public static void main(String[] args) { // Car 클래스를 이용하여 myCar 객체 생성 Car myCar = new Car(); System.out.println("제조회사 : " + myCar.company); System.out.println("모델명 : " + myCar.model); System.out.println("색깔 : " + myCar.color); System.out.println("최고속도 : " + myCar.maxSpeed); System.out.println("현재속도 : " + myCar.speed); myCar.speed = 60; System.out.println("현재속도 : " + myCar.speed); } } // 출력 : // 제조회사 : 현대자동차 // 모델명 : 그랜저 // 색깔 : 검정 // 최고속도 : 350 // 현재속도 : 0
위와 같이 클래스를 별도로 만들어야하지만 한 class 폴더 안에 다 저장할 수도 있습니다.
7. 생성자 선언과 호출
▷ 기본 생성자 : 클래스에 생성자 선언이 없으면 컴파일러는 기본 생성자를 바이트코드 파일에 자동으로 추가합니다.
▷ 생성자 선언 : 객체를 다양하게 초기화하기 위해 생성자를 직접 선언할 수 있습니다.
▷ 생성자는 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일합니다.
▷ 매개변수의 타입은 매개 값의 종륭에 맞게 작성합니다.
// Car class 초기화 Car(){ } Car(String model, String color, int maxSpeed){ }
이전에 작성했던 클래스에 위 아래와 같은 내용을 넣습니다.//CarExample class Car myCar2 = new Car("제네시스", "빨강", 250);
▷ 필드 초기화 : 객체마다 동일한 값을 가지고 있다면 필드 선언 시 초기값을 대입하는 것이 좋고,
객체마다 다른 값을 가져야 한다면 생성자에서 필드를 초기화하는 것이 좋습니다.
public class Korean { //필드 선언 String nation = "대한민국"; String name = "그랜저"; String ssn = "검정"; public Korean(String name, String ssn) { this.name = name; this.ssn = ssn; } }
public class KoreanExample { public static void main(String[] args) { Korean k1 = new Korean("박자바", "011225-1234567"); System.out.println("k1.nation : " + k1.nation); System.out.println("k1.name : " + k1.name); System.out.println("k1.ssn : " + k1.ssn); Korean k2 = new Korean("김자바", "930525-0654321"); System.out.println("k2.nation : " + k2.nation); System.out.println("k2.name : " + k2.name); System.out.println("k2.ssn : " + k2.ssn); } } // 출력 : // k1.nation : 대한민국 // k1.name : 박자바 // k1.ssn : 011225-1234567 // k2.nation : 대한민국 // k2.name : 김자바 // k2.ssn : 930525-0654321
▷ 생성자 오버로딩
▶ 매개변수를 달리하는 생성자를 여러 개 선언하는 것
▶ 매개변수의 타입, 개수, 선언된 순서가 똑같을 경우 매개변수 이름만 바꾸는 것은 생성자 오버로딩이 아닙니다.
▶ 생성자가 오버로딩되어 있을 경우, new 연산자로 생성자를 호출할 때 제공되는 매개값의 타입과 수에 따라 실행될
생성자가 결정됩니다.
public class Car { //필드 선언 String company = "현대자동차"; String model; String color; int maxSpeed; Car(){ } Car(String model){ this.model = model; } Car(String model, String color){ this.model = model; this.color = color; } Car(String model, String color, int maxSpeed){ this.model = model; this.color = color; this.maxSpeed = maxSpeed; } }
public class CarExample { public static void main(String[] args) { // Car 클래스를 이용하여 myCar 객체 생성 Car car1 = new Car(); System.out.println("car1.company : " + car1.company); System.out.println("car1.model : " + car1.model); System.out.println(); Car car2 = new Car("자가용"); System.out.println("car2.company : " + car2.company); System.out.println("car2.model : " + car2.model); System.out.println(); Car car3 = new Car("자가용", "빨강"); System.out.println("car3.company : " + car3.company); System.out.println("car3.model : " + car3.model); System.out.println("car3.color : " + car3.color); System.out.println(); Car car4 = new Car("택시", "빨강", 200); System.out.println("car4.company : " + car4.company); System.out.println("car4.model : " + car4.model); System.out.println("car4.color : " + car4.color); System.out.println("car4.maxSpeed : " + car4.maxSpeed); System.out.println(); } } // 출력 : // car1.company : 현대자동차 // car1.model : null // // car2.company : 현대자동차 // car2.model : 자가용 // // car3.company : 현대자동차 // car3.model : 자가용 // car3.color : 빨강 // // car4.company : 현대자동차 // car4.model : 택시 // car4.color : 빨강 // car4.maxSpeed : 200
▷ 다른 생성자 호출
▶ 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있습니다.
▶ 이 경우 공통 코드를 한 생성자에만 집중적으로 작성하고, 나머지 생성자는 this(...)를 사용해 공통 생성자 호출
public class Car { //필드 선언 String company = "현대자동차"; String model; String color; int maxSpeed; Car(String model){ this(model, "은색", 250); } Car(String model, String color){ this(model, color, 250); } Car(String model, String color, int maxSpeed){ this.model = model; this.color = color; this.maxSpeed = maxSpeed; } } // 생성자 선언을 줄이고 싶다면 오버로딩 변수에 맞춰서 this(값1, 값2, 값3)로 사용하면 됩니다.
public class CarExample { public static void main(String[] args) { // Car 클래스를 이용하여 myCar 객체 생성 Car car1 = new Car("자가용"); System.out.println("car1.company : " + car1.company); System.out.println("car1.model : " + car1.model); System.out.println("car1.color : " + car1.color); System.out.println("car1.maxSpeed : " + car1.maxSpeed); System.out.println(); Car car2 = new Car("자가용", "빨강"); System.out.println("car2.company : " + car2.company); System.out.println("car2.model : " + car2.model); System.out.println("car2.color : " + car2.color); System.out.println("car2.maxSpeed : " + car2.maxSpeed); System.out.println(); Car car3 = new Car("택시", "빨강", 200); System.out.println("car3.company : " + car3.company); System.out.println("car3.model : " + car3.model); System.out.println("car3.color : " + car3.color); System.out.println("car3.maxSpeed : " + car3.maxSpeed); System.out.println(); } } // 출력 : // car1.company : 현대자동차 // car1.model : 자가용 // car1.color : 은색 // car1.maxSpeed : 250 // // car2.company : 현대자동차 // car2.model : 자가용 // car2.color : 빨강 // car2.maxSpeed : 250 // // car3.company : 현대자동차 // car3.model : 택시 // car3.color : 빨강 // car3.maxSpeed : 200
클래스에 대해서 알아보았습니다. 메인에 코드를 줄이기 위해서 class를 잘 사용하는 것이 중요할 것같네요!!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Java' 카테고리의 다른 글
[java] 이것이 자바다 ch06 인스턴스 및 정적 멤버 (0) | 2023.01.11 |
---|---|
[java] 이것이 자바다 ch06 메소드 (0) | 2023.01.11 |
[java] package jar 파일 만들기 (export/import) (0) | 2023.01.11 |
[java] 클래스를 이용한 문제 풀이 (0) | 2023.01.10 |
[java] 이것이 자바다 ch05 확인 문제(array) (0) | 2023.01.10 |