JAVA-객체 지향 프로그래밍(OOP)

2023. 1. 25. 15:44코딩일기/JAVA

  • class : 객체의 종류
  • 객체 : 고유의 기능과 값을 가진 녀석(변수 + 함수)

Java System Library에 2000여개의 클래스가 있다.

클래스를 가지고 객체를 생성하는 것이 객체 지향 프로그래밍!

 

이것을 다 외워서 쓴다는건 무리. 사용자가 직접 만들어 쓰는 사용자 정의 class 가 있다.

 

  • 사용자 정의  class

custom 객체! 

 

 class를 만드는 방법 - 4가지 위치.

 1) 별도의 .java 문서에 만들기

 2) 하나의 .java 문서안에 여러개의 class를 설계하기

 3) class안에 또 다른 class 설계하기

 4) 함수(메소드)안에 class를 설계하기

 

// 사용자 정의 클래스
public class Second {
	// 클래스는 멤버변수(필드)와 멤버함수(메소드)로 구성

	// 멤버변수(필드)
	int a;

	// 멤버함수(메소드)
	void aaa() {
		System.out.println("Second aaa method");
		
		// 함수안에 다른 class 설계
		// 지역 class 라고 부름 ===================
		class Nice {
			int a;
			void show(){
				System.out.println("Nice show method");
			}
		}//=====================
		
	}//aaa method
	
	// 다른 클래스 설계하기 //////////////////////////
	//inner class 라고 부름
	class Hello{
		int a;
		void show() {
			System.out.println("Hello show method");
			
			
		}
	}////////////////////////////////
	
}//Second class

// 또 다른 class를 선언할 수 있음.
class Third {
	int a;
	
	void show() {
		System.out.println("Third show method");
	}
}

 

public class Main {
	public static void main(String[] args) {

		// 객체지향프로그래밍(OOP) - 객체 위주로 프로그래밍을 한다.
		// 객체 : 고유한 기능과 값을 가진 녀석(변수 + 함수)
		// class : 객체의 종류

		// OOP는 이런 객체들을 필요할 때 만들어서 기능을 사용하여 프로그래밍 하는 방식
		// 자바에서는 자주 사용될 기능들을 이미 만들어 설계해 놓았다.
		// 이런 설계도 파일들을 class 라고 부른며..2000여개 정도 존재함.
		// 이런 class들을 Java System Library API 라고 부름.

		// 아무리 2000여개의 클래스가 있더라도 내가 원하는 모든 기능이 모두
		// 있을 수는 없음. 그래서 개발자가 기능을 만들어야 하는 경우도 있음.
		// 이를 사용자 정의 클래스 라고 부른다.

		// class를 만드는 방법 - 4가지 위치.
		// 1) 별도의 .java 문서에 만들기
		// 2) 하나의 .java 문서안에 여러개의 class를 설계하기
		// 3) class안에 또 다른 class 설계하기
		// 4) 함수(메소드)안에 class를 설계하기

		// 개발자가 정의한 class를 이용하여 객체 생성
		Second s = new Second();
		s.a = 10; // 멤버변수 사용
		s.aaa();  // 멤버함수 사용
		
		
		Third t = new Third();
		t.a = 100;
		t.show();
		
		//Second클래스 안에 설계한 Hello inner 클래스
		//Hello h = new Hello(); // 못알아들음
		//Second.Hello h = new Second.Hello(); //이너클래스는 객체 생성 불가

	}
}

 

Package 사용 방법!

 

// bbb 패키지안에 있는 Student클래스를 편하게 사용하도록 미리 불러오기
import java.util.*; //java.util 안에 있는 모든 클래스 
import bbb.Student;

public class Main {
	public static void main(String[] args) {

		// 기본적인 class를 설계하고 객체를 생성하여 사용하는 모습
		Test t = new Test();
		t.a = 10; // 멤버변수 사용
		t.show(); // 멤버함수 호출

		// 같은 이름의 class를 사용하게 되는 문제가 발생할 수도 있음.
		// 이때 사용하는 것이 package 라는 개념임.
		// 물리적인 폴더구분을 통해 같은 이름의 class를 구별

		// 사용자정의 클래스로 Student 객체를 생성해보기
		// 즉, 학생의 정보[이름, 나이, 주소]를 가진 클래스
		aaa.Student stu = new aaa.Student();
		stu.name = "sam";
		// stu.age = 20; //error (public 필요!)

		// 또 다른 학생에 대한 정보가 필요할 수 있음.
		// [이름, 국어, 영어] 데이터를 가진 클래스
		// 이 때도 Student 라는 이름이 적합해 보임.
		bbb.Student stu2 = new bbb.Student();
		stu2.name = "robin";
		stu2.kor = 80;
		stu2.eng = 90;

		// bbb패키지의 Student클래스 객체가 또 필요하다면?
		// 패키지명을 매번 작성하는 것이 귀찮음
		// 그래서 이 .java문서 안에서는 bbb. 패키지를 마음대로 인식할 수 있도록
		// 미리 클래스를 가져오기 - import
		Student stu3 = new Student();
		Student stu4 = new Student();

		// 2000여개의 Java System API 클래스들은 모두 패키지가 있음.
		java.util.Random rnd = new java.util.Random();
		// 즉, Random 클래스 앞에 쓰는 java.util. 이 패키지명 이었던 것임.
		// java.util 패키지명 쓰는 것이 번거로워서 import 했던것임.
		Random rnd2 = new Random();

		java.util.Scanner scan = new java.util.Scanner(System.in);

		// 패키지 중에서 특별한 패키지 하나가 존재함.
		// String, System .. 이런 클래스들이 있는 java.lang 패키지
		// 원래는 패키지명을 같이 써야 하기에 아래처럼 써야 하지만
		java.lang.String s = new java.lang.String("Hello");
		// java.lang은 워낙 기본적인 클래스들만 있어서 자바언어에서 자동 import 함
		String s2 = new String("Nice"); // 자동 import

		aaa.Person p = new aaa.Person();

		// Java System API 클래스들의 패키지명이 모두
		// xxx.xxx 라는 식으로 두 단어 이상으로 구성됨
		// 패키지명을 가급적 유의미한 단어(마치 카테고리 같은)를 사용하고
		// 두 단어 이상으로 사용하기를 권장함.
		// 보통은 클래스를 만든 회사명의 도메인을 역으로 작성함
		// 예) 지도 클래스 Map 클래스
		// 이를 만드는 회사가 3개 Google Naver Kakao
		// com.google.Map
		// com.naver.Map
		// com.kakao.Map

		// kr.or.mrhi.android.Map
		// 이 때 패키지명은 반드시 소문자로만 작성할 것을 강제로 권장함.
		// 여러 단어를 구분할 때 사용하는 . 은 하위폴더를 의미함
		mrhi.dev.First f = new mrhi.dev.First();
		
		mrhi.dev.android.Second ss = new mrhi.dev.android.Second(); 
	}
}
package aaa;
// [이름, 나이, 주소] 데이터를 저장하는 학생정보 클래스
public class Student {
	public String name; // 다른 패키지에서도 멤버를 사용하게 하려면 public
	int age;
	String address;
	
	// 같은 패키지의 다른 클래스는 그냥 사용
	Person p = new Person();
}
package aaa;

public class Person {
	public String name;
	public int age;
}
package bbb;

import aaa.*;
// [이름, 국어, 영어] 데이터를 가진 클래스
public class Student {
	
	public String name;
	public int kor;
	public int eng;
	
	Person p;
	
	// default 패키지에 있는 Test 클래스 사용해보기
	// default 패키지는 패키지명이 없기에 다른 패키지에서는 사용 불가능
	///???.Test t;
}

접근 제한자 Access Modifier

import aaa.Second;

public class Main {
	public static void main(String[] args) {

		// OOP는 객체의 멤버들을 외부에서 마음대로 사용하는 것에 대해 제한
		// 그래서 존재하는 접근제한자 라는 문법이 존재함.

		// 멤버접근을 제한하는 제한자의 4가지 종류 [보안 강 --> 약]
		// 1. private : 본인 클래스 안에서만 접근이 가능한 제한자
		// 2. default : 같은 패키지 안에서는 . 연산자로 멤버접근이 가능, 다른 패키지에서는 접근 불가
		// 3. protected : 같은 패키지 안에서는 . 연산자로 멤버접근이 가능, 다른 패키지에서는 접근 불가, 단, 상속관계라면 접근 가능함
		// 4. public : 어디서든 . 연산자만 있으면 접근 가능

		// 같은 패키지의 클래스 객체 생성
		First f = new First();

		// 다른 패키지의 클래스 객체 생성
		Second s = new Second();
		s.d = 40;

		// 멤버함수 호출 - 함수도 멤버에 대한 접근제한영향 받음
		// s.show() // error
		s.output();
	}
}

 

public class First {
	// 4가지 유형의 접근제한자가 적용된 멤버변수들
	private int a;
	int b; // 아무 명시가 없을때 default
	protected int c;
	public int d;

	// 멤버함수
	void aaa() {
		// 같은 클래스안에 있는 멤버변수들은 접근제한자와 상관없이 그냥 사용
		a = 30;
		b = 20;
		c = 10;
		d = 40;
	}
}
package aaa;

public class Second {
	// 접근제한자가 부여된 4개의 멤버변수
	private int a;
	int b;
	protected int c;
	public int d;

	// defalut 접근제한 멤버함수
	void show() {
		a = 100;
		b = 200;
		c = 300;
		d = 400;

		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
		System.out.println(d);
	}

	// public 접근제한
	public void output() {
		System.out.println("public 메소드");
	}
}

 

 

First.java                 Main.Java

private 으로 선언된 int a

같은 패키지 안에 있지만 다른 클래스에 있는 Main 에서 볼 수 없다.


다른 패키지의 Second 클래스에 있는 public으로 선언한 d 외에는

다른 접근제한자가 부여된 멤버변수는 참조할 수 없다

Second.java
Main.java

 

GitHub - jake5113/Mrhi_JAVA

Contribute to jake5113/Mrhi_JAVA development by creating an account on GitHub.

github.com

 

반응형

'코딩일기 > JAVA' 카테고리의 다른 글

Java - 생성자 Constructor  (0) 2023.01.26
JAVA- 메소드 오버로딩 method overloading  (0) 2023.01.25
Java-Method  (0) 2023.01.25
JAVA-Array 연습 문제 풀기  (0) 2023.01.25
JAVA-Array (참조형 배열)  (0) 2023.01.20