본문 바로가기
개발 공부 Today I Learned

[국비 18일차 TIL] 객체 지향 OOP

by 개발자신입 2023. 12. 14.
반응형

혼자 공부하는 자바

 

- 객체 지향 프로그래밍

 

객체 지향 프로그래밍(OOP : Object-Oriented Programming), 객체를 하나씩 조립해서 완성된 프로그램을 만드는 기법

 

객체(Object)

물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것

객체는 속성과 동작으로 구성되어 있음.

속성 = 필드, 구성 = 메소드

 

클래스

클래스 = 설계도

인스턴스 = 클래스로부터 만들어진 객체

 

클래스 선언 규칙

  • 하나 이상의 문자로 이루어져야 함. (Car, SportsCar...)
  • 첫 글자에는 숫자가 올 수 없음.
  • 특수문자는 '$', '_'만 사용 가능.
  • 자바 키워드 사용 불가
  • 영어 대소문자 구분 필수
  • class 뒤에는 반드시 소문자로 작성해야 함

 

new 연산자 new 클래스();

 

클래스의 구성 멤버

필드 : 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳

생성자 : new 연산자로 호출되는 특별한 중괄호 {} 블록

메소드 : 객체의 동작에 해당하는 중괄호 {} 블록

 

 

- 필드

필드는 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳

타입 필드 [ = 초기값 ] ;

 

필드 초기화

  • 정수 타입    0
  • 실수 타입    0.0
  • boolean      false
  • 참조 타입    null

 

- 생성자

생성자는 new 연산자로 호출되는 중괄호 {} 블록이며, 객체의 초기화를 담당함.

객체 초기화란 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것

 

생성자 오버로딩

매개 변수를 달리하는 생성자를 여러 개 선언하는 것

 

this() 생성자

자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용

 

- 메소드

객체의 동작에 해당하는 중괄호 {} 블록

어떤 일들을 처리하는 실행문들을 모아놓은 블록

 

void : 리턴값이 없는 메소드

 

메소드 이름 규칙

  • 숫자로 시작 불가
  • 특수문자는 '$', '_'만 가능
  • 관례적으로 메소드 이름은 소문자로 작성
  • 단어가 혼합된 이름이라면 뒤에 오는 단어의 첫 글자를 대문자로 작성

 

final 필드 : 저장된 초기값이 최종값이므로, 수정이 불가함.

 

상수(static final) : 불변의 값

 


 


import java.util.Arrays;
import java.util.Iterator;

class Cat{
	// 속성 : 변수
	String name; // 초기화 no (초기화하면 모든 고양이가 같은 이름을 가져감)
				 // 기본값 null
	int golgol = 50;
	
	// 생성자 : 인스턴스를 생성할 때 사용하는 메소드
	public Cat(String name) {
		this.name = name;
		
	}
	
	// 기능 : 메소드
	public void stroke(int count) {
		if(golgol >= 60) {
			System.out.println("골골송 수치가 "+golgol + "입니다.");
			count++;
			System.out.println("♥ ♥ ♥ ♥ ♥ ♥ 골골송을 부릅니다. ♥ ♥ ♥ ♥ ♥ ♥");
			System.out.println("♥ ♥ ♥ ♥ ♥ ♥ 골골송을 부릅니다. ♥ ♥ ♥ ♥ ♥ ♥");
		} else {
			System.out.println(count + "회 만졌습니다.");
			System.out.println("골골송 수치가 1 올라갑니다.");
			System.out.println("현재 골골 수치 : " + golgol++);
		}
	}
	
	
	public void sleep() {
		System.out.println(name + "(이)가 잠을 잡니다.");
	}
}

public class CM01 {
	public static void main(String[] args) {
		Cat cat1 = new Cat("콩이");
		Cat cat2 = new Cat("봄이");
		Cat cat3 = new Cat("삼이");
		Cat cat4 = new Cat("댕이");
		
		Cat cats[] = new Cat[4];
		cats[0] = cat1;
		cats[1] = cat2;
		cats[2] = cat3;
		cats[3] = cat4;
	
		for (Cat cat : cats) {
			cat.sleep();
		}
//		cat1.sleep();
//		cat2.sleep();
//		cat3.sleep();
//		cat4.sleep();
		
		for (int i = 0; i < 11; i++) {
			cat1.stroke(i);
		}
		
	}
}

 

 

// 메소드


	public int sleep() {
		System.out.println(name + "(이)가 잠을 잡니다.");
		return this.name.length();	
		}
	
	public int add(int num1, int num2) {
		int num3 = num1 + num2;
		return num3;
	}


		System.out.println(cat1.golgol);
		System.out.println(cat2.golgol);
		
		int length = cat1.sleep();
		System.out.println(length);
		
		int result = cat4.add(10, 20); // 호출할 때는 파라미터 수, 순서, 타입에 맞게
		System.out.println(result);

 

package oop;

class Human { 	// 클래스는 절대 겹치지 않게, 메소드와 클래스 안에 생성 불가!
	// 속성 = 변수
	String name;
	int age;
	String addr; 
	
	// 생성자 (리턴타입 없음)
	public Human(String name, int age) { 
		this.name = name;
		this.age = age;
	}  
	
	// 오버로딩 : 같은 이름으로 여러개 만들 수 있음. 파라미터가 다르면 다른 것.
	public Human(String name, int age, String addr) {
		this.name = name;
		this.age = age;
		this.addr = addr;
	}
	
	// 기능 = 메소드
	
}

public class OOP2 {

	public static void main(String[] args) {
		// 인간
		 Human h1 = new Human("홍길동", 1);	// 생성자 (가장 먼저 실행)
		 
		 System.out.println(h1); // oop.Human@73a28541
		 System.out.println(h1.name); // 홍길동
		 System.out.println(h1.age);  // 1
		 System.out.println(h1.addr); // null

		 Human h2 = new Human("김길동", 5);
		 System.out.println(h2.name); // 김길동
		 System.out.println(h2.age);  // 5
		 System.out.println(h2.addr); // null

		 Human h3 = new Human("금수저", 10, "서울시");
		 System.out.println(h3.name); // 금수저
		 System.out.println(h3.age);  // 10
		 System.out.println(h3.addr); // 서울시
		 
		 Human h4 = new Human("집", 100, null);
	}

}

 

package test;

// 2022년 2회차 17번
class Conv {
	public Conv(int a) { // 생성자
		this.a = a; // 3 대입
	}

	int func() { // 기능 (a = 5, b = 1, i =1)
		int b = 1;
		for (int i = 1; i < a; i++) { // a = 5 (i = 1~4)
			b = a * i + b;  // b = 51
			
			// 1 = 5 * 1 + 1 (6)
			// 6 = 5 * 2 + 6 (16)
			// 16 = 5 * 3 + 16 (31)
			// 31 = 5 * 4 + 31 (51)
			
		}
		return a + b; // (5 + 51 = 61)
	}

	int a; // 속성
}

public class Test01 {
	public static void main(String[] args) {
		Conv obj = new Conv(3); // a=5 
		obj.a = 5;
		int b = obj.func();
		System.out.println(obj.a + b);
	}
}
반응형

댓글