클래스란?
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. 동시성 문제를 고려해서 설계해야 하기 때문에 난이도가 있다.
클래스에서 변수
표 중요!!