-
[17회차-③] JAVA (클래스)JAVA 2021. 4. 14. 20:41
강의명 : 오픈프레임워크 활용 디지털융합 SW엔지니어 양성 과정
강의 날짜 : 21.04.14
<클래스>
1. 클래스의 선언
class Point01{ //사용자 지정 클래스 int x; int y; }; //클래스 선언문 public class Ex01 { //메인 클래스 public static void main(String[] args) { Point01 pt01 = new Point01(); //객체 생성 pt01.x=10; pt01.y=20; System.out.println(pt01.x+", "+pt01.y); } }
클래스는 실행 메소드인 main메소드를 가진 실행(메인) 클래스와 사용자 지정 클래스로 나뉜다.
*Point01클래스는 class앞에 접근 지정자가 생략되어 있는데, 이런 것을 default 접근제한 지정자라고 한다.
default는 같은 패키지 내에서만 접근이 가능하다.
*public은 All access!
어디서든 누구나 접근이 가능하다.
외부 어디선든 실행을 시킬 수 있다. 그래서 main은 public접근제한 지정자를 가지고 있다.
*사용자 지정 클래스를 사용하기 위해서는 객체를 생성해 주어야 한다.
(자료형=클래스명) (객체명) = new (생성자) ;
배열과 같이 객체를 생성하면 객체는 주소를 가지게 되고 Point01 class만큼의 메모리를 할당받게 된다.
그 외는 배열과 다를 것이 없다.
왜? 배열도 객체이기 때문에.
ex ) String s = "AB";
String은 문자 배열이고 역시나 클래스를 자료형으로 가지고 있으며 " "가 { }와 new 역할을 해주어 메모리 할당과 초기화를 해주고 있다.
즉, class는 사용자 정의 데이터 타입이다!
2. 멤버 변수와 멤버 메소드
멤버 변수란 클래스 안에서 정의한 변수이다.
멤버 메소드는 클래스 안에서 정의한 메소드이다.
이 멤버 변수를 참조하기 위해서는 . (참조연산자, 접근 연산자) 을 사용한다.
class를 참조하여 멤버 변수를 사용하기 때문에 클래스를 참조 자료형이라고 부르는 것이다.
3. private 접근 제한 지정자
class Point02{ private int x; //멤버 변수 private int y; //멤버 변수 public void setX(int new_x) { //멤버 메소드 x=new_x; } public void setY(int new_y) { //멤버 메소드 y=new_y; } public int getX() { //멤버 메소드 return x; } public int getY() { //멤버 메소드 return y; } } public class Ex02 { public static void main(String[] args) { Point02 pt02 = new Point02(); pt02.setX(10); pt02.setY(20); System.out.println(pt02.getX()+", "+pt02.getY()); } }
* private 접근 제한 지정자는 보안이 가장 세다.
같은 클래스 내에서만 접근이 가능하다.
메인 클래스에서 객체를 생성하여 해당 변수에 접근을 시도하지만,
이 객체 조차 클래스의 외부에서 생성된 것이다. 그러므로 접근 불가하다.
그래서 멤버 메소드는 가능한 한 public으로 지정한다.
직접적으로 private 멤버 변수에 접근할 수 없으니 public 메소드에 접근하여 우회적으로 멤버 변수에 접근하기 위해.
* 위의 Point02 클래스처럼 멤버 변수와 setter(멤버 변수를 초기화 해주는 메소드)와 getter(멤버 변수를 반환하는 메소드)를 가지고 있는 클래스를 기본 클래스, Plain Object라고 한다.
4. 소멸
위의 메인 클래스 Ex02에서 args와 pt02도 main 메소드의 지역 객체이다.
그러므로 main 메소드를 나갈 때 종료 중괄호 뒤에서 이 객체들은 소멸한다.
소멸은 생성의 역순으로 이루어진다.
* Stack에서 이루어지는 소멸
지역 객체가 스택에 push된다.
[자료구조]CH5. 스택
참조 : C로 배우는 쉬운 자료구조(이지영 저) 공부날짜 : 2021.01.31 스택의 이해 1. 스택의 개념과 구조 스택은 데이터를 차곡차곡 쌓아올린 형태로 자료를 구성한다. 스택은 같은 구조와 같은 크
crystal93.tistory.com
* 객체는 스택에 삽입되고, 멤버 변수(객체 변수)들은 Heap에 저장되고, 메소드는 메소드 기억장치에 저장된다.
*(_)언더바를 사용한 이름 : 스네이크 방식
중간에 대문자를 사용한 이름 : 카멜 케이스
5. 메소드 오버로딩 (중복 정의)
메소드의 이름을 똑같이 중복 정의하는 것이 가능하다.
다만, 다음의 규칙을 지켜야 한다.
* 매개 변수의 개수가 다르거나,
자료형이 다르거나.
순서가 달라야한다.
class Overload { void test() { System.out.println("매개변수 없음"); } void test(int a, int b) { System.out.println("매개변수 int "+a+"와 int "+b); } double test(double a) { System.out.println("매개변수 double "+a); return a*2; } } public class Ex05 { public static void main(String[] args) { Overload ob = new Overload(); //객체 생성 double result; ob.test(); ob.test(5, 10); result=ob.test(100); //업캐스팅 System.out.println("ob.test(100)의 결과 : "+result); result=ob.test(4.2); System.out.println("ob.test(4.2)의 결과 : "+result); } }
* 위에서 매개변수가 하나인 경우는 double형이지만 main메소드에서 100이라는 int자료형을 주었다.
int는 4바이트, double은 8바이트로 double의 메모리가 더 커서 저절로 업캐스팅되어 자료형이 변환되었다.
6. static 접근 제한 지정자
static 이 붙으면 객체를 생성하지 않고도 호출이 가능하다.
호출을 할 때는 그 애들이 포함된 클래스명과 접근 연산자 . 를 사용하여 호출이 가능하다.
* 멤버 메소드
1) 객체 메소드
객체를 생성해서 접근할 수 있는 메소드.
설사 그게 자기 자신이 포함된 클래스라고 해도 호출을 하려면 무조건 객체를 생성해야 한다.
2) 클래스 메소드
객체를 생성하지 않고도 클래스명으로 접근이 가능한 메소드.
static 이 앞에 붙어 있어서 static 메소드라고도 한다.
하지만 자기 자긴이 포함된 클래스 안에서 호출하려는 경우라면 클래스명이 필요없다.
3) 실행 메소드 (main 메소드)
4) 생성자(constructor)
* 멤버 변수
1) 객체 변수 : 객체를 생성하여 접근 가능한 변수
2) 클래스 변수 : 클래스명만으로 접근 가능한 변수(static)
이 때, 객체 변수는 Heap에 저장되지만 클래스 변수는 static memory에 저장된다.
그런데 이 static memory는 method memory안에 있다.
7. 생성자
생성자는 멤버 변수를 초기화하는 의무를 가지고 있으며, 그 외의 일은 할 수 없다.
즉, 반환형(return type)이 있을 수 없다.
클래스 이름과 똑같은 것이 생성자이다.
객체를 생성할 때 생성자가 호출되는 것을 확인할 수 있다.
자동 초기화가 되는 이유가 생성자가 호출되기 때문이다.
생성자도 오버로드가 가능하다.
class Point7{ int x,y; public Point7() { System.out.println("default 생성자"); } public Point7(int new_x,int new_y) { //생성자 오버로드 x=new_x; y=new_y; } public void showPoint() { System.out.println(x+", "+y); } } public class Ex07 { public static void main(String[] args) { Point7 pt7 = new Point7(); //객체 생성과 생성자 호출 System.out.println(pt7.x+", "+pt7.y); Point7 pt8 = new Point7(300,400); //객체 생성과 파라미터가 있는 생성자 호출 System.out.println(pt8.x+", "+pt8.y); } }
'JAVA' 카테고리의 다른 글
[19회차] JAVA (상속) (0) 2021.04.17 [18회차] JAVA (String 클래스와 Wrapper 클래스) (0) 2021.04.15 [17회차-②] JAVA (메소드) (0) 2021.04.14 [17회차-①] JAVA (배열) (0) 2021.04.14 [16회차-②] JAVA (반복문) (0) 2021.04.13