일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- mysql
- flaskframework
- Crawling
- OOP
- openapi
- mongodb
- requests
- portfolio
- javascript
- fetch
- Algorithm
- beautifulsoup
- pymongo
- get
- json
- frontend
- atlas
- synology
- CSS
- backend
- github
- Project
- body
- flask
- java
- NAS
- CRUD
- POST
- venv
- PYTHON
Archives
- Today
- Total
wisePocket
[JAVA] 기초문법 - Method의 이용, 초기화 - 객체 지향 프로그래밍(OOP) - 28 본문
Java & Algorithm/Java
[JAVA] 기초문법 - Method의 이용, 초기화 - 객체 지향 프로그래밍(OOP) - 28
ohnyong 2023. 7. 29. 22:4727에서 Class 선언 -> 필드 선언 -> Constuctor 선언 -> Method 선언 까지 기본 골격을 갖췄다.
이제 기본 골격을 실제로 사용하기 위해서는
- 선언된 변수 초기화(값 할당)
- 내부 접근
- 외부 접근
- Method 이용
이 단계 까지 필요하다. 이 단계까지 하면 기본적으로 간단한 입력을 받는 CLI 계산기 정도는 만들 수 있다. 이 골격을 활용해서 Algorithm 문제를 풀려고 여기까지 일단 진도를 밟았다.
알고리즘 문제를 풀려고 첫 장을 열었을 때 "2개의 값을 입력 받아 합을 구하는 함수를 구현하세요." 가 나왔는데, 갑자기 예전에 배운것, 파이썬, 자바스크립트, 모든 구현 방법과 객체, 메서드? 너무 많은 정보가 급하게 배운 만큼 꼬이고 꼬여서 머릿속에 정리가 안됬었다. 당장 "int num1;"를 타이핑 하고 그 이후를 어떻게 해야 할 지 틀이 잡히지 않았다. 그래서 나는 어떻게 보면 나에게 익숙한 객체지향의 틀을 가지고 저 문제들을 설계하고 단계적으로 접근하기로 마음먹었다. 단순하게 객체 지향으로 구조를 만들지 않아도 풀 코테지만 뭔가 이전에 배웠던 것들이 이것 저것 꼬이는 것 보다 뭔가 나에게 직관적으로 어떤 변수가 필요한지, 어떤 계산이 필요한지, 메인에서는 어떤 입력을 파라미터로 넘길 것인지, 이렇게 구조화시켜야 머릿속으로 정리되는 것 같았다. 실습 코드와 별개로 저 위의 알고리즘 첫 문제를 동일한 방법으로 아래 몰래 구현했다.
1. 객체의 필드(변수값) 초기화(할당) - 내부 접근
객체를 만들었으나 필드는 선언만 된 상태이며, 설계도인 클래스에서도 직접 기본값을 주어지지 않았고, 외부(메인)에서도 호출하여 할당하지 않았다. 먼저 내부 접근(클래스 내)에서 속성에 값을 주어보려 한다.(초기화)
여기서 변수로 선언된
String model = "X7 : SAV"
boolean lights = true
Tire 객체를 생성하면서 참조형 변수로 주소값
위 3개 항목을 Class Car 내에 직접 할당했다. 이것이 내부 접근이다.
이 말은 나머지 변수들은 아직 0, null 등 기본값이 적용되어 있다는 것이다.
package _06OOP; /*클래스를 만들기 위해서는 4가지 STEP이 필요하다. * ------------------------------------- * 1. 만들려고 하는 설계도를 선언 (== 클래스 선언) * 2. 객체가 가지고 있어야 할 속성(필드)를 정의 * 3. 객체를 생성하는 방식을 정의.(생성자) * -constructor * 4. 객체가 가지고 있어야 할 행위(메서드)를 정의 * ------------------------------------- * */ //--------1. "Car"라는 설계도를 선언 public class Car { //--------2. "Car"가 가지고 있어야 할 <속성(필드) 영역> // 1) 고유 데이터 영역 String company; //자동차 회사 String model = "X7 : SAV"; //자동차 모델 <- 초기화 내부 접근 String color; //자동차 색 double price; //자동차 가격 // 2) 상태 데이터 영역 double speed; //자동차 속도 char gear; //기어 상태(P, R, N, D) boolean lights = true; //자동차 조명의 상태 <- 초기화 내부 접근 // 3) 객체 데이터 영역 Tire tire = new Tire(); // <- 초기화 내부 접근 Door door; Handle handle; //--------3. 객체 생성 방식 <생성자 영역> public Car() { // logic // 기본 생성자 : 생략이 가능 System.out.println("Car() 기본 생성자가 호출되었습니다. 객체가 생성됩니다."); } //--------4. 메서드 영역 ... }
Main.java에서의 테스트
-------초기값 설정 테스트 내부 접근-------- 타이어 기본 생성자가 호출되어 객체가 생성되었습니다. Car() 기본 생성자가 호출되었습니다. 객체가 생성됩니다. -------------------- car.model : X7 : SAV car.color : null -------------------- car.speed : 0.0 car.gear : car.lights : true -------------------- car.tire : _06OOP.Tire@5cad8086 car.door : null
2. 객체의 필드(변수값) 초기화(할당) - 외부 접근
이번엔 설계도인 클래스가 아닌 실행부인 Main.java에서 객체를 통해 호출하여 접근하여 값을 할당하고자 한다. 클래스 외부에서 초기화를 진행하는 것이다.
여기서 아직 클래스에서 초기화가 되지 않은 객체의 필드값들에 다음과 같이 들어가도록 car.field명 으로 접근하여 값을 할당한다.
String color = "blue"
double speed = "100"
추가로 내부 접근으로 이미 true 값이 할당된 필드가 외부 접근 할당과 겹치면 어떻게되는지 궁금해서 내부 초기화 값을 그대로 두고 아래처럼 외부 접근 초기화를 추가해보았다.
boolean lights = "false" / class 내 true 상태
위 3개 항목을 car라고 외부(메인)에서 생성된 객체를 통해서 도트접근으로 .color라는 필드를 찾고, 할당하게 된다. 이것이 외부 접근이다. 또한 내부, 외부 중복 되는 경우에도 객체를 생성하고 값을 새로 초기화 하는 개념이기 때문에 외부접근이 이기게 된다.
package _06OOP; import java.util.Scanner; public class Main { public static void main(String[] args) { ... System.out.println("-------초기값 설정 테스트 외부 접근--------"); //필드 사용(<-외부 접근 외부에서(메인에서) 객체 내 초기화 한 것 car.color = "blue"; car.speed = 100; car.lights = false;//<- 내부에서 초기화 한 것인데 외부에서 한번 더 필드 변경한 것 System.out.println("car.model : "+car.color); System.out.println("car.model : "+car.speed); System.out.println("car.model : "+car.lights);//<- 외부에서 재설정하여 이것이 적용 된다. ... } }
Main.java에서의 테스트
-------초기값 설정 테스트 외부 접근-------- car.color : blue car.speed : 100.0 car.lights : false
3. 메서드(Method) 이용
Main.java에서의 테스트이제 기본 객체 지향의 하이라이트인 Method를 이용해보자. 사실 초기화와 비슷한 점이 많다. 외부에서 동작을 구현한 메서드 이름을 호출하면 그 내부 동작이 작동하는 원리다.
주의 할 점은 return과 (void는 제외) type을 신경 써야 하는 것이 핵심이다. 또한 파라미터(매개변수)로 넘기는 경우 마찬가지로 넘기는 변수의 type은 당연히 일치해야 하고 클래스에서method가 파라미터를 받아내는 부분의 변수 순서와호출하여 method로 파라미터를 보내는 변수 순서가 같아야 한다.
Car클래스의 설계도를 통해 car4라는 객체를 생성하고
도트연산자를 통해 객체 내 .gasPedal(), .onOffLights, .carSpeeds() 메서드를 호출한다. 파라미터(매개변수)로 메서드에서 받는 파라미터의 순서, type에 맞추어 원하는 값을 입력한다. 그럼 Class 내에서는 해당 메서드에서 파라미터를 받아내고 그 값을 변수에 할당하게 된다. 그리고 반환값이 있는 경우엔 연산 등 처리 후 반환한다. 반환값이 없는 경우(void) 해당 메서드 로직을 수행하고 종료된다.
.gasPedal()의 파라미터로는 double 100, Char 'D' 를 전달한다. 메서드 로직은 기본적으로 double로 들어온 숫자(kmh)를 speed에 할당한다. 또한 chageGear()라는 메서드를 내부 호출하고 파라미터로 들어온 Char 'D'를 type 변수에 할당한다.
.onOffLights()의 파라미터는 없으며 해당 메서드의 로직은 현재 값을 뒤바꾸는 lights = !lights; 가 수행되고 반환된다.
.carSpeeds()는 가변 메서드로 파라미터 갯수가 여러개 들어오는 것을 알아서 처리 하게 되는데 반복문을 통하여 들어온 값들을 배열의 반복문으로 조회하는 로직이 들어가있다.
package _06OOP; import java.util.Scanner; public class Main { public static void main(String[] args) { ... System.out.println("-------아래 Car4는 메서드 이용 접근 테스트--------"); Car car4 = new Car(); //객체 생성 System.out.println("(패달밟기전)gear = "+car4.gear); double speed = car4.gasPedal(100, 'D'); System.out.println("speed = "+ speed); boolean lights = car4.onOffLights(); System.out.println("lights = "+lights); System.out.println("(패달밟기후)gear = "+car4.gear); System.out.println("-------아래 Car4는 가변 ... 길이 메서드 이용 접근 테스트--------"); car.carSpeeds(120, 50); System.out.println("--------"); car.carSpeeds(87, 90, 64); } }
Car.java의 각 메서드 코드
package _06OOP; //--------1. "Car"라는 설계도를 선언 public class Car { //--------2. "Car"가 가지고 있어야 할 <속성(필드) 영역> // 1) 고유 데이터 영역 String company; //자동차 회사 String model = "X7 : SAV"; //자동차 모델 <- 초기화 내부 접근 String color; //자동차 색 double price; //자동차 가격 // 2) 상태 데이터 영역 double speed; //자동차 속도 char gear; //기어 상태(P, R, N, D) boolean lights = true; //자동차 조명의 상태 <- 초기화 내부 접근 // 3) 객체 데이터 영역 Tire tire = new Tire(); // <- 초기화 내부 접근 Door door; Handle handle; //--------3. 객체 생성 방식 <생성자 영역> public Car() { // logic // 기본 생성자 : 생략이 가능 System.out.println("Car() 기본 생성자가 호출되었습니다. 객체가 생성됩니다."); } //--------4. 메서드 영역 //gasPedal() //intput : kmh //output : speed double gasPedal(double kmh, char type){ changeGear(type);//<- 내부 메소드 호출, 전제, 가속도 페달을 밟으면 자동으로 기어가 변한다. speed = kmh; return speed; } ... //changeGear() //intput : type(P, R, N, D) //output : speed char changeGear(char type){ gear = type; return gear; } //onOffLight() //intput : X (<-on/off지만 작동 하냐 마냐로) !로. //output : lights boolean onOffLights(){ lights = !lights; return lights; } ... //자동차의 속도 .. 가변길이 메서드 void carSpeeds(double ... speeds){ for (double v : speeds){ System.out.println("v = " +v); } } }
Main.java에서의 테스트-------아래 Car4는 메서드 이용 접근 테스트-------- 타이어 기본 생성자가 호출되어 객체가 생성되었습니다. Car() 기본 생성자가 호출되었습니다. 객체가 생성됩니다. (패달밟기전)gear = speed = 100.0 lights = false (패달밟기후)gear = D -------아래 Car4는 가변 ... 길이 메서드 이용 접근 테스트-------- v = 120.0 v = 50.0 -------- v = 87.0 v = 90.0 v = 64.0
'Java & Algorithm > Java' 카테고리의 다른 글
[JAVA] 기초문법 - ✅️객체 지향 프로그래밍(Object-Oriented Programming, OOP) - 27 (0) | 2023.07.29 |
---|---|
[JAVA] 기초문법 - 자료구조 컬렉션 Map 생성과 메서드 기능 이용 연습 - 26 (0) | 2023.07.27 |
[JAVA] 기초문법 - 자료구조 컬렉션 Set 생성과 메서드 기능 이용 연습 - 25 (0) | 2023.07.27 |
[JAVA] 기초문법 - 자료구조 컬렉션 Queue 생성과 메서드 기능 이용 연습 - 24 (0) | 2023.07.27 |
[JAVA] 기초문법 - 자료구조 컬렉션 Stack 생성과 메서드 기능 이용 연습 - 23 (0) | 2023.07.27 |