👨🏻‍💻

클래스와객체

과목
JAVA
태그
CLASS
OBJECT
클래스
객체
StudyDate
2020/12/22

클래스란?

1.
서로 다른 자료형의 데이터들을 사용자 정의로 하나로 묶어 새로운 타입을
정의한것
public class Member { /* 전역변수(필드 == 인스턴스 == 속성)이라고 부른다*/ String id; String pwd; String name; int age; char gender; String[] hobby;
Java
복사
2. 다른 곳에서 필드의 접근하기 위해 '.' 참조연산자를 활용
public class Application1 { public static void main(String[] args) { //1. 객체를 생성하는구문 Member member = new Member(); //2. stack부분 member라는 변수가 선언됨 //3. member변수명을 이용해 Member 클래스에 있는 변수들을 // '.' 참조연산자로 불러올수 있다 member.id = "user01"; member.pwd = "pass01"; member.name = "홍길동"; member.age = 20; member.gender = '남'; member.hobby = new String[] {"축구", "볼링", "테니스"}; } }
Java
복사

캡슐화란?

변수가 선언된 필드에 바로접근하게되면 문제점이 발생한다
1. 올바르지않은값이 입력될수 있다
2.필드의 이름이나 자료형을 변경할 때 모두 수정해줘야한다.
이러한 문제점을 잡아주는게 바로 '캡슐화'이다
캡슐화의 장점
: 필드에 직접접근을 제한하여 public 메소드를 이용해 간접적으로 접근하여
사용하게됨으로 인해 결합도를 낮춰준다.
결합도가 낮다 == 유지보수성이 좋다
필드 접근제한자 종류(매우중요)
1.
public(+) 해당클래스/ 같은패키지 / 후손클래스 /전체
2.
protected(#) 해당클래스 /같은패키지 /후손클래스
3.
default(~) 해당클래스 /같은패키지
4.
private(-) 해당클래스

객체 지향언어?

현실세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있음
객체들간에 발생하는 모든사건들은 객체들간의 상호작용이다
이것을 토대로 프로그래밍한게 객체지향언어이다.

클래스와 인스턴스

클래스 : 객체를 추상화 한것으로 인스턴스를 생성할 목적으로 정의해놓은 소스코드 작성단위
ex) 클래스 : 인류
객체 : 아시아인, 유럽인

객체의 할당

추상화란?

유연성을 확보하기 위해 구체적인것을 제거
유연성확보 = 재사용성증가, 오류발생감소,중복코드감소
즉 공통점을 추출하고 공통점이아닌걸 제거한다는의미이다

생성자란?

* 인스턴스를 생성할 때 초기 수행 명령이 있는 경우 미리 작성해두고, 인스턴스를 생성할 때 호출된다. * 생성자 함수에 매개변수가 없는 생성자를 기본생성자(default constructor)라고 하며, * 기본생성자는 compiler에 의해 자동적으로 추가된다 * 이렇게 기본생성자를 이용해 인스턴스를 생성하게 되면 자료형별 초기값을 이용해 필드를 초기화하게된다. * 필드의 초기값을 사용자가 원하는대로 설정하고 싶은경우 생성자의 호출시 인자로 값을 전달하여 호출 할 수있다.
ex) public example(String name, int pwd)
* 이러한 인자를 받아 필드를 초기화할 목적의 생성자를 매개변수 있는 생성자라고 한다. * 매개변수 있는 생성자가 한 개 라도 존재하는 경우 compiler는 기본생성자를 자동으로 추가해주지 않는다. * 매개변수 있는 생성자는 주로 인스턴스 생성 시점에 필드값을 사용자가 원하는대로 초기화할 목적으로 사용된다.

this 란?

모든 인스턴스의 메소드에 숨겨진 채 존재하는 레퍼런스 변수로 할당된 인스턴스 주소가 저장된다.
public User() { /*초기 인스턴스 생성 시 수행할 명령이 있는 경우 작성한다.*/ System.out.println("User 클래스의 기본 생성자 호출함"); } /*동일한 이름의 생성자 혹은 메소드를 한 클래스안에서 작성하는 것은 불가능하다.*/ // public User() {} /*매개변수 있는 생성자*/ /*초기화할 필드가 여러개 인 경우, 초기화하고 싶은 필드의 갯수별로 생성자를 여러 개 준비해 둘 수 있다.*/ /*id, pwd, name의 초기화를담당할 생성자*/ public User(String id, String pwd, String name) { /* 매개변수 선언부에 작성한 매개변수의 타입, 갯수, 순서에 따라 동일한 생성자 혹은 메소드를 * 한 클래스 내부에 여러개 작성할 수 있게 만든 기술이다.(오버로딩) * * */ this(); this.id =id; this.pwd = pwd; this.name =name; System.out.println("User 클래스의 id, pwd, name을 초기화하는 생성자 호출함..");
Java
복사
package com.greedy.section04.constructor; public class Application { public static void main(String[] args) { User user1 = new User(); User user2 = new User("user01", "pass01", "홍길동"); } }
Java
복사

오버로딩이란?

동일한 메소드명이지만 매개변수 선언부의 타입, 갯수, 순서를 다르게 작성하는법

왜 사용할까?

매개변수의 종류별로 메소드 내용을 다르게 작성해야 하는 경우들이 종종있다. 이 때, 동일한 기능의 메소드를 매개변수에 따라 다르게 이름을 정의하면 복잡하고 관리하기가 매우어려울 것이다. 규모가 작은 프로그램의 경우에는 그 정도가 덜하지만, 규모가 거대해지면 메소드 또한 관리하기가 매우 어려워진다.

오버로딩의 조건은?

동일한 이름을 가진 메소드의 파라미터 선언부에 매개변수의 타입, 갯수,순서를 다르게 작성하여 한 클래스 내에 동일한 이름의 메소드를 여러 개 작성할 수 있도록 한다. 메소드의 시그니처(Signiture)가 다르면 다른 메소드로 인식하기 때문이다. 즉, 시그니쳐 중 메소드의 이름은 동일해야 하기 때문에 선언부가 다르게 작성되어야
오버로딩이 성립된다.
/*메소드 시그니처*/ public void method(int num) { } /*(int num)을 시그니처라고 부른다. /*매개변수의 갯수 변화에 따른 오버로딩 성립 확인*/ public void test(int num1, int num2) {} /*매개변수의 타입 변화에 따른 오버로딩 성립 확인*/ public void test(int num, String name) {} /*매개변수의 순서에 따른 오버로딩 성립 확인*/ public void test(String name, int num) {}
Java
복사

파라미터란?

메소드의 파라미터 선언부에는 다양한 종류의 값을 인자로 전달하며 호출할 수 있다 * 매개변수(parameter)로 사용 가능한 자료형
1.기본자료형 2.기본자료형 배열 3.클래스 자료형 4.클래스 자료형 배열 5.가변 인자
ackage com.greedy.section05.parameter; public class Application { public static void main(String[] args) { /*3. 클래스 자료형*/ RectAngle rectAngle = new RectAngle(12.5 , 22.5); System.out.println("인자로 전달하는 값 : " + rectAngle); pt.testClassTypeParameter(rectAngle); System.out.println("=========== 메소드 호출 후 사각형의 넓이와 둘레 ============"); rectAngle.calcArea(); rectAngle.calcRound(); } } --------------------------------------------------------------------------------- package com.greedy.section05.parameter; public class ParameterTest { public void testClassTypeParameter(RectAngle rectAngle) { /*인스턴스의 주소값이 전달된다. * 즉, 인자로 전달하는 인스턴스와 매개변수로 전달 받은 인스턴스는 서로 동일한 인스턴스를 가리킨다. * */ System.out.println("매개변수로 전달 받은 값 : " + rectAngle); System.out.println("================= 사각형의 넓이와 둘레 출력 ================"); rectAngle.calcArea(); rectAngle.calcRound(); /*사각형의 너비와 높이 변경*/ rectAngle.setWidth(100); rectAngle.setHeight(100); System.out.println("=============== 변경 후 사각형 넓이와 둘레 출력 ================"); rectAngle.calcArea(); rectAngle.calcRound(); }}
Java
복사

final이랑 static

static

: 정적 메모리 영역에 프로그램이 start 될 때 할당을 하는 키워드이다. 인스턴스를 생성하지 않고도 사용할 클래스의 멤버(필드 , 메소드 )에 지정할 수있다. 여러 인스턴스가 공유해서 사용할 목적의 공간이다. 하지만 static 키워드의 남발은 유지보수와 추적이 힘든 코드를 작성하는 피해야 할 방식이다. *명확한 목적이 존재하지 않는 이상 static 키워드 사용은 자제를 해야한다. 의도적으로 static 키워드를 사용하는 대표적인 예는 singleton 객체를 생성할 때이다.

final

: final은 종단의 의미를 가지는 키워드이다. final 키워드를 사용할 수 있는위치는 다양한 편이며 의미가 약간은 다르지만 결국 변경 불가라는 의미이다. 1.지역변수 : 초기화 이후 값 변경 불가 2.매개변수 : 호출 시 전달한 매개변수 값 변경 불가 3.전역변수 : 인스턴스 생성후 초기화 된 이후에는 값 변경 불가. 4.클래스(static)변수 : 프로그램 start 이후 값 변경 불가 5.non-static 메소드 : 메소드 재작성(overriding)불가 6.static 메소드 : 메소드 재작성(overriding)불가 7.클래스 : 상속불가

Singleton Pattern이란?

어떤클래스가 최초 한번만 메모리를 할당하고 그 메모리에 인스턴스를만들어서 하나의 인스턴스를 공유해서 사용하며 메모리 낭비를 방지할 수 있게함 (매번 인스턴스를 생성하지 않음) 장점 1. 첫번째를 이용시에는 인스턴스를 생성해야하므로 속도차이가 나지 않지만
두번째 이용시에는 인스턴스를 생성하는 시간 없이 사용할 수 있다. 2. 인스턴스가 절대적적으로 한개만 존재하는 것만 보증할 수 있다. 단점 1. 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유하면 결합도가 높아진다. (유지보수와 테스트에 문제점이 있음) 2. 동시성 문제를 고려해서 설계해야 하기 때문에 난이도가 있다.

클래스에서 변수

표 중요!!