내용: 객체, 클래스, 생성자, 접근 제한 지시
1. 객체지향이란
- 객체지향 프로그래밍(Object Oriented Programming, OOP)은 프로그래밍 패러다임 중 하나로, 코드를 객체라는 기본 단위로 나눠 설계하고 구현하는 방식을 말합니다.
객체지향 프로그래밍의 특징
- 캡슐화(Encapsulation)
- 데이터와 그 데이터를 처리하는 함수를 하나의 '객체'로 묶는 것을 말합니다.
- 이를 통해 데이터를 보호하고 코드를 보다 쉽게 관리할 수 있습니다.(은닉화)
- 상속(Inheritance)
- 이미 만들어진 클래스의 속성과 메서드에 다른 클래스가 물려받아 기능을 추가하는 것을 말합니다.
- 코드의 재사용을 촉진하고, 코드의 관리를 효율적으로 만듭니다.
- 다형성(Polymorphism)
- 같은 이름의 메서드가 다른 동작을 하는 것을 말합니다.
- 예를 들어, 같은 이름의 메서드가 입력된 인자에 따라 다르게 동작할 수 있습니다.
- Overriding
- 추상화(Abstraction)
- 복잡한 시스템을 단순화하여 효과적으로 다루기 위해 중요한 부분만을 표현하는 것을 말합니다.
객체(Object)
- 어떤 속성과 기능을 가지고 있는 데이터를 말합니다.
- 속성(필드): 객체가 가진 고유한 특성
- 기능(메서드): 객체가 할 수 있는 동작
- 객체는 클래스에 의해 정의되고 생성됩니다(객체의 설계도)
2. 클래스(Class)
- 객체를 만들려면 먼저 클래스를 만들어야합니다.
- 클래스는 객체를 만들기 위한 설계도 또는 객체를 찍어내는 틀에 비유할수 있습니다.
- 붕어빵이 객체라면 붕어빵 틀은 클래스입니다.
public class Main {
public static void main(String args[]){
Turtle turtle1 = new Turtle();
Turtle turtle2 = new Turtle();
Turtle turtle3 = new Turtle();
}
}
- Turtle : 거북이 클래스(Turtle.java 제공)
- turtle1: 거북이 객체
- turtle2: 거북이 객체
- turtle3: 거북이 객체
클래스 형식
public class 클래스명{ // public 접근 제한 지시
}
클래스 생성
class Rabbit{ // 새오룬 클래스 정의
String Shape = "";
int xPos;
int yPos;
void setPosition(int x, int y){ // 위치 변경 메서드 정의
xPos = x;
yPos = y;
}
}
public class Main {
public static void main(String[] args){
}
}
3. 메서드의 형식
반환데이터형 메서드명(매개변수){
// 메서드 내용
}
메서드 생성
void printSimpleText(){
System.out.println("초간단 메서드입니다");
}
// 반환데이터가 없다면 반환 데이터형으로 void를 사용하며,
// 메서드에 매개변수가 없다면 void를 생략할 수 있습니다.
매개변수와 반환값이 있는 메서드
int sumMehod(int num1, int num2){
int retNumber = num1 + num2;
return retNumber
}
int value = sumMethod(100, 200);
System.out.println("합: "+value);
4. 객체 생성
class Rabbit{ // 새오룬 클래스 정의
String Shape = ""; // 필드 정의
int xPos;
int yPos;
void setPosition(int x, int y){ // 위치 변경 메소드 정의
xPos = x;
yPos = y;
}
}
public class Main {
public static void main(String[] args){
Rabbit rabbit1 = new Rabbit(); // 새로운 객체1 생성
Rabbit rabbit2 = new Rabbit(); // 새로운 객체2 생성
Rabbit rabbit3 = new Rabbit(); // 새로운 객체3 생성
}
}
필드에 값 대입
class Rabbit{ // 새오룬 클래스 정의
String Shape = "";
int xPos;
int yPos;
void setPosition(int x, int y){ // 위치 변경 메소드 정의
xPos = x;
yPos = y;
}
}
public class Main {
public static void main(String[] args){
Rabbit rabbit1 = new Rabbit(); // 새로운 객체 생성
Rabbit rabbit2 = new Rabbit(); // 새로운 객체 생성
Rabbit rabbit3 = new Rabbit(); // 새로운 객체 생성
rabbit1.Shape = "circle"; // 객체의 속성 변경
rabbit2.Shape = "rectangle"; // 객체의 속성 변경
rabbit3.Shape = "triangle"; // 객체의 속성 변경
}
}
기능(메서드) 호출
class Rabbit{ // 새오룬 클래스 정의
String Shape = "";
int xPos;
int yPos;
void setPosition(int x, int y){ // 위치 변경 메소드 정의
xPos = x;
yPos = y;
}
}
public class Main {
public static void main(String[] args){
Rabbit rabbit1 = new Rabbit(); // 새로운 객체 생성
Rabbit rabbit2 = new Rabbit(); // 새로운 객체 생성
Rabbit rabbit3 = new Rabbit(); // 새로운 객체 생성
rabbit1.Shape = "circle"; // 객체의 속성 변경
rabbit2.Shape = "rectangle"; // 객체의 속성 변경
rabbit3.Shape = "triangle"; // 객체의 속성 변경
rabbit1.setPosition(1, 1); // 객체의 메소드 호출
rabbit2.setPosition(2, 2); // 객체의 메소드 호출
rabbit3.setPosition(3, 3); // 객체의 메소드 호출
}
}
5. 생성자
- 객체지향 프로그램의 필수 요건 중 하나인 생성자를 잘 이해하면 코드의 길이가 더 짧으면서도 명확하게 코딩할 수 있습니다.
- 생성자는 객체를 생성하면 무조건 호출되는 메서드를 말합니다.
Rabbit rabbit = new Rabbit(); // 객체 생성
rabbit.Shape = "circle"; // 객체의 모양을 초기화
객체를 생성하면서 모양을 초기화하면?
- 코드가 간결해지고, 객체를 생성하면서 값을 초기화하기 때문에 속성에 초기값을 대입하는 것을 잊어버리는 일도 없을 것입니다.
- 이렇게 각체를 생성하면서 변수의 값을 초기화하는 메서드를 생성자라고합니다.
- 생성자도 메서드이므로 생성자 메서드라고도 부릅니다.
생성자 코드
- 생성자는 클래스명과 동일하며, 생성자 앞에는 아무것도 붙지 않습니다.
- 자동으로 shape은 토끼가 됩니다.
class Rabbit{ // 새오룬 클래스 정의
String shape = "";
int xPos;
int yPos;
Rabbit(){ // 생성자는 클래스명과 동일하며, 생성자 앞에는 아무것도 붙지 않습니다.
shape = "토끼";
}
void setPosition(int x, int y){ // 위치 변경 메소드 정의
xPos = x;
yPos = y;
}
}
전체 코드
class Rabbit{ // 새오룬 클래스 정의
String shape = "";
int xPos;
int yPos;
Rabbit(){ // 생성자 정의
shape = "토끼";
}
//void setPosition(int x, int y){ // 위치 변경 메소드 정의
// xPos = x;
// yPos = y;
//}
}
public class Main {
public static void main(String[] args){
Rabbit rabbit1 = new Rabbit(); // 새로운 객체 생성
Rabbit rabbit2 = new Rabbit(); // 새로운 객체 생성
Rabbit rabbit3 = new Rabbit(); // 새로운 객체 생성
System.out.printf("토끼 객체의 기본 모양은 %S입니다.\\n",rabbit1.shape);
//rabbit1.shape = "circle"; // 객체의 속성 변경
//rabbit2.shape = "rectangle"; // 객체의 속성 변경
//rabbit3.shape = "triangle"; // 객체의 속성 변경
//rabbit1.setPosition(1, 1); // 객체의 메소드 호출
//rabbit2.setPosition(2, 2); // 객체의 메소드 호출
//rabbit3.setPosition(3, 3); // 객체의 메소드 호출
}
}
매개변수(파라미터)를 받는 생성자
class Rabbit{ // 새오룬 클래스 정의
String shape = "";
int xPos;
int yPos;
Rabbit(String value){ // 생성자 정의
shape = value;
}
//void setPosition(int x, int y){ // 위치 변경 메소드 정의
// xPos = x;
// yPos = y;
//}
}
public class Main {
public static void main(String[] args){
Rabbit rabbit1 = new Rabbit("토끼"); // 새로운 객체 생성
Rabbit rabbit2 = new Rabbit("삼각형"); // 새로운 객체 생성
Rabbit rabbit3 = new Rabbit("원"); // 새로운 객체 생성
System.out.printf("토끼1 객체의 기본 모양은 %S입니다.\\n",rabbit1.shape);
System.out.printf("토끼2 객체의 기본 모양은 %S입니다.\\n",rabbit2.shape);
System.out.printf("토끼3 객체의 기본 모양은 %S입니다.\\n",rabbit3.shape);
//rabbit1.shape = "circle"; // 객체의 속성 변경
//rabbit2.shape = "rectangle"; // 객체의 속성 변경
//rabbit3.shape = "triangle"; // 객체의 속성 변경
//rabbit1.setPosition(1, 1); // 객체의 메소드 호출
//rabbit2.setPosition(2, 2); // 객체의 메소드 호출
//rabbit3.setPosition(3, 3); // 객체의 메소드 호출
}
}
매개변수명과 this
- 만약 매개변수명을 shape으로 바꾸면 null이 출력된다
- 매개변수가 속성보다 더 우선순위이기 때문이다.
class Rabbit{ // 새오룬 클래스 정의
String shape = "";
int xPos;
int yPos;
Rabbit(String shape){ // 생성자 정의
shape = shape; // 두 shape 모두 매개변수 shape이다.
}
}
public class Main {
public static void main(String[] args){
Rabbit rabbit1 = new Rabbit("토끼"); // 새로운 객체 생성
Rabbit rabbit2 = new Rabbit("삼각형"); // 새로운 객체 생성
Rabbit rabbit3 = new Rabbit("원"); // 새로운 객체 생성
System.out.printf("토끼1 객체의 기본 모양은 %S입니다.\\n",rabbit1.shape);
System.out.printf("토끼2 객체의 기본 모양은 %S입니다.\\n",rabbit2.shape);
System.out.printf("토끼3 객체의 기본 모양은 %S입니다.\\n",rabbit3.shape);
}
}
- 이럴때에는 현재 클래스를 의미하는 this 예약어를 사용하면 됩니다.
- 아래 처럼 this.shape으로 고치면 shape속성을 의미하게 됩니다.
class Rabbit{ // 새오룬 클래스 정의
String shape = "";
int xPos;
int yPos;
Rabbit(String shape){ // 생성자 정의
this.shape = shape;
//(자기 클래스의 속성) (매개변수)
}
}
6. 접근 제한 지시자
- 외부에서 속성이나 메서드에 접근하도록 허용할지 여부를 지정한다.
public | 클래스, 패키지, 자식, 전체 |
protected | 클래스, 패키지, 자식 |
없을때 | 클래스, 패키지 |
private | 클래스 |
package |
private : 외부에서의 직접 접근 제한
- private가 붙은 속성은 메서드를 통해서만 접근이 가능.
class Rabbit2{ // 새오룬 클래스 정의
private String shape;
private int xPos;
private int yPos;
void setPosition(int x, int y){ // 위치 변경 메소드 정의
xPos = x;
yPos = y;
System.out.println("토끼의 위치는 (" + xPos + "," + yPos + ")입니다.");
}
}
public class study2 {
public static void main(String[] args){
Rabbit2 rabbit = new Rabbit2(); // 새로운 객체 생성
rabbit.setPosition(100,200); // 객체의 메소드로 접근하여 속성 변경함
// rabbit.xpos = 1000; // 직접 접금은 불가
// rabbit.ypos = 1000;
}
}
public : 외부에서의 접근 허용
- 외부에서 클래스 안의 속성이나 메서드에 접근할 수 있다.
- 직접 접근 가능
class Rabbit2{ // 새오룬 클래스 정의
public String shape;
public int xPos;
public int yPos;
void setPosition(int x, int y){ // 위치 변경 메소드 정의
xPos = x;
yPos = y;
}
}
public class study2 {
public static void main(String[] args){
Rabbit2 rabbit = new Rabbit2(); // 새로운 객체 생성
//rabbit.setPosition(100,200); // 객체의 메소드로 접근 하여 속성 변경함
rabbit.xPos = 1000; // 직접 접금 가능
rabbit.yPos = 2000;
System.out.println("토끼의 위치는 (" + rabbit.xPos + "," + rabbit.yPos + ")입니다.");
}
}
private, public 사용 원칙
- 속성에는 private를 붙여 외부에서 직접 접근하지 못하도록 합니다.
- 메서드에는 public을 붙여 외부에서 자유롭게 접근가능하도록 합니다.
- 메서드를 통해서만 속성에 접근하도록 합니다.
class Rabbit{ // 새오룬 클래스 정의
private String shape;
private int xPos;
private int yPos;
public void setShape(String shape){ // 모양 변경 메소드
this.shape = shape;
}
public String getShape(){ // 모양 조회 메소드
return this.shape;
}
public void setPosition(int x, int y){ // 위치 변경 메소드
this.xPos = x;
this.yPos = y;
}
public int getX(){ // 위치 조회 메소드
return this.xPos;
}
public int getY(){ // 위치 조회 메소드
return this.yPos;
}
}
public class study {
public static void main(String[] args){
Rabbit rabbit = new Rabbit(); // 새로운 객체 생성
rabbit.setShape("흰토끼"); // 객체의 메소드로 접근 하여 속성 변경함
rabbit.setPosition(100,200); // 객체의 메소드로 접근 하여 속성 변경함
System.out.printf("토끼 객체의 모양은 [%s]입니다.\\n", rabbit.getShape());
System.out.printf("토끼 객체의 위치는 (%d,%d)입니다.\\n", rabbit.getX(), rabbit.getY());
// 토끼 객체의 모양은 [흰토끼]입니다.
// 토끼 객체의 위치는 (100,200)입니다.
}
}
'Java > Java 입문' 카테고리의 다른 글
[JAVA] C4. 데이터형과 문자열 (0) | 2023.12.19 |
---|---|
[JAVA] C3. 연산자 (2) | 2023.11.21 |
[JAVA] C2. 변수 (0) | 2023.11.21 |
[JAVA] C1. 자바 비긴즈 (0) | 2023.11.21 |