[TIL] [Java] 0705

윤경·2021년 7월 5일
0

Java

목록 보기
3/10
post-thumbnail

자바 객체지향 프로그래밍
: 객체 는 일반적으로 말하는 물건을 의미하며 여기서 물건은 단순한 데이터가 아니고 그 데이터의 조작 방법에 대한 정보 또한 포함하고 있어 그것을 대상으로 다루는 수법을 객체지향 이라고 함.

사용자 정의 함수

public static int function(int a, int b) {
	return 0;
}

charAt() 함수 : input.charAt(input.length()-1); 일 때 input에 저장된 문자열의 마지막 문자 하나

세 개의 수에서 가장 큰 값 찾기

public static int max(int a, int b) {
	return (a>b) ? a:b;
}
public static int function(int a, int b, int c) {
	int result = max(a,b);
    result = max(result, c);
    return result;
}

이런 식으로 쉽게 찾을 수 있음.


재귀함수

public static int factorial(int n) {
	if(n == 1)
    	return 1;
    else
    	return n * factorial(n - 1);
}
// 5! = 5 * 4! 이기 때문

배열

// 배열 선언
int[] array = new int[10];

// 배열에 채울 수 입력받아 채우기
Scanner sc = new Scanner(System.in);
for(int i=0; i<10; i++) {
	array[i] = sc.nextInt();
}

(int) (Math.random() * 100+1);
➡ 1~100까지 랜덤한 정수


다차원 배열

int[][] array = new int[10][10]
10 x 10 짜리 2차원 배열


클래스

: 객체지향 프로그래밍에 있어 가장 기본.
클래스를 이용해 현실 세계 특정한 물건을 지칭할 수 있음.
가장 대표적으로 많이 사용되는 것이 Node 클래스.

이는 하나의 장소나 위치를 의미할 수도 있으며 자료구조에서 말하는 이진 탐색 트리의 하나의 서브 트리가 될 수 있음.
또한 개발 프로젝트에서는 종종 Student 클래스와 같이 하나의 처리할 데이터 단위를 명시함.

Node 클래스를 만들어줌 (Main부분은 생성하지 않도록 체크박스 해제된 상태 그대로 생성)


public class Node {
	
	// x, y 자체는 외부에서 접근할 수 없도록 private로 선언
	private int x;
	private int y;
	
	// x를 외부에서 접근할 수 있는(얻는) 함수를 만들어줌(public)
	public int getX() {
		return x;
	}
	// x 값을 설정할 수 있도록 하는 함수
	public void setX(int x) {
		// 여기서 가지고 있는 고유한 x의 값을 인자로 받은 x값으로 바꾸어주기 위해서 this
		this.x = x;

	}
	
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;

	}
	
	// 생성자
	// :인스턴스 즉, 객체를 만들어 줄 때 자동으로 값을 넣어주는(초기화 해주는) 함수
	public Node(int x, int y) {
		// 특징은 클래스와(Node) 같은 이름(Node)을 가짐
		this.x = x;
		this.y = y;
	}
	
	public Node getCenter(Node other) {
		// 반환형이 Node
		// 다른 점과 비교해 정 중앙을 반환하는 함수
		return new Node((this.x + other.getX()) / 2, (this.y + other.getY()) / 2);
	}
	
}

Main클래스


public class Main {

	public static void main(String[] args) {

		Node one = new Node(10, 20);
		Node two = new Node(30, 40);
		
		// result는 one과 two의 정 중앙 좌표가 들어가게 됨.
		Node result = one.getCenter(two);
		
		System.out.println("x: " + result.getX() + ", y: " + result.getY());
		
	}

}

➡ 출력시킨 결과값은 result로 one과 two의 중앙인 x: 20, y: 30이 나오게 됨.
Main문에서는 활용만 하도록 함.


상속

Person 클래스를 Main문 없이 만들기

private String name;
private int age;
private int height;
private int weight;

이렇게 만들어준 뒤 마우스 오른쪽 클릭 -> source -> Generate getters and setters -> select all 로 만들면 쉽게 getter와 setter를 생성할 수 있음.

(getter와 setter는 보안상 함부로 접근할 수 없게 만들기 위해 존재)

또한 마우스 오른쪽 클릭 -> source -> Generate Constructor using Fields 로 가진 변수들을 한 번에 초기화 해주는 함수를 생성할 수 있음.(생성자)

여기서 super(); 라는 것은 자신의 부모 클래스의 생성자를 실행하겠다는 것.

Student 클래스를 Main문 없이 만들기

public class Student extends Person {
	private String studentID;
	private int grade;
	// GPA: 외국식 학점
	private double GPA;
}

extends Person은 Person 클래스를 상속하겠다는 것.

이렇게 만들어준 뒤 또한 source의 Generate Getters and Setters에서 모두 생성.
(필수적인 과정이기 때문에 거의 해주면 됨)

또한 같은 방법으로 Generate Constructor using Fields로 생성자를 만들어줌.

public void show() {
	System.out.println("-----------------------------");
	System.out.println("학생 이름: " + getName());
	System.out.println("학생 나이: " + getAge());
	System.out.println("학생 키: " + getHeight());
	System.out.println("학생 몸무게: " + getWeight());
	System.out.println("학번: " + getStudentID());
	System.out.println("학년: " + getGrade());
	System.out.println("학점: " + getGPA());
}

Student 클래스에 이렇게 show() 함수를 만들어줌.

Main클래스 만들기


public class Main {

	public static void main(String[] args) {

		Student student1 = new Student("하", 23, 165, 55, "20181518", 4, 4.5);
		Student student2 = new Student("윤경", 23, 170, 60, "20181515", 4, 4.5);
		
		student1.show();
		student2.show();
		
	}

}

➡ 이렇게 상속받은 내용으로 만든 클래스를 이용해 studen1, 2라는 객체를 생성했고 show() 함수를 통해 결국 두 학생의 정보를 출력할 수 있음.

➡ 이렇게 객체지향의 장점 을 볼 수 있었음


students[i] = new Student("가나다", 23, 165, 50, i+"", 4, 4.5);
i+"" 로 integer 형을 string으로 바꿀 수 있음.


추상 Abstract

추상 클래스는 직접적으로 객체 인스턴스를 생성할 수 없음. 하지만 새로운 클래스를 작성하는데 밑바탕이 되는 역할을 해준다는 것에서 의미가 있음. 어느정도 미리 설계로써 틀을 갖추고 클래스를 작성할 수 있게 한다는 기능적인 측면에서 의미가 있음.

Player라는 추상 클래스 생성

abstract class Player {
	abstract void play(String songName);
	abstract void pause();
	abstract void stop();
}

public 대신 abstract 를 써서 추상 클래스로 만듦.

Main 클래스에서 구현
extends Player를 추가하면 warning을 눌러 Add unimplemented methods 를 누르면 구현할 수 있게 틀이 생김.

public class Main extends Player {

	public static void main(String[] args) {
		Main main = new Main();
		main.play("Joakim Karud - Mighty Love");
		main.pause();
		main.stop();
	}

	@Override
	void play(String songName) {
		System.out.println(songName + " 곡을 재생합니다.");
	}

	@Override
	void pause() {
		System.out.println("곡을 일시정지합니다.");
	}

	@Override
	void stop() {
		System.out.println("곡을 정지합니다.");
	}

}

결국 추상 클래스는 꼭 구현해야 하는 요소를 알려줌으로써 체계적인 측면에서 의미가 있음.

미리 어떤 함수를 사용한다는 것을 정의해놓는 의미.


Final

: 값이 변하는 것을 막고 오버라이딩(재정의) 되는 것을 방지하고 상속을 불가능하게 만듦.


Interface 인터페이스

추상 클래스보다 더 추상적.(= 미리 구현할 수 없고 정말 설계만 가능한) 설계의 본질.

자바에서 다중 상속을 구현하게 해주는 고급 기술.

반드시 사전에 정의된 추상 메솓와 상수만을 가질 수 있음.

팀 프로젝트의 동시 작업에 유리하고 일반적으로 추상보다 요구되는 설계의 기준이 높아 더 체계적이라는 평을 받고 있음.

인터페이스 안에서는 정말 설계만 해야지 실질적으로 코드를 작성하면 에러를 뱉음. (같은 코드일 때 abtract class Dog로 하면 되고 public interface Dog로 하면 안되는)

// Dog 클래스
public interface Dog {
	abstract void crying();
	public void show();
}

➡ 이처럼 interface 일 때는 public void show() 에 실질적인 코드가 들어가면 안됨.

// Main 클래스
public class Main implements Dog {

	public static void main(String[] args) {
		Main main = new Main();
		main.crying();
		main.show();
	}

	@Override
	public void crying() {
		System.out.println("월월!");
	}

	@Override
	public void show() {
		System.out.println("Hello, World!");
	}

}

Polymorphism 다형성


Object 객체

: 객체 클래스는 모든 객체의 조상으로써 쓰임.

자바에서 사실 모든 클래스는 암시적으로 Object 클래스를 상속받고 있음.


📢

거의 이틀만에 Java 기억 되살리기
정말 기억이 하나도 안 났는데 동빈나 선생님 강의를 들으니까 그래도 기본적인 틀은 기억이 나서 다행이다.

문제를 좀 더 풀면서 연습을 해야 할 것 같다.

끝!

profile
개발 바보 이사 중

0개의 댓글