변수와 달리 하나의 클래스에 동일한 이름의 메서드는 여러개 정의할 수 있음
데이터 타입이 달라도 변수 이름이 동일한 경우를 허용 X → 프로그램이 모호해진다.
변수와 달리 하나의 클래스에 동일한 이름의 메소드는 여러개 정의 가능
→ 매개변수의 개수와 타입을 통해 실행될 메소드를 구분 가능하기 때문에
#하나의 클래스에 동일한 이름의 메소드가 여러개 중복 되어 정의되는것→ 메소드 overloading
자바 같은 객체 지향 언어에서만 제공
동일한 이름의 메소드라도 매개변수의 형태에따라 다른 일을 수행 할 수 있다.
데이터 타입별로 값을 출력하는 메소드 정의 가능
-printInt(int data),printChar(char data) → printdata(int data) , printdata(char data) 가능
코드의 재사용성 증가
유형
-매개변수와 개수와 타입이 모두 다른경우
-매개변수의 개수와 타입이 같지만 순서가 다른 경우
-매겨변수가 형변환된 다른 타입인 경우
클래스로부터 객체를 생성할 때 객체의 변수들을 초기화하는 역할을 담당하는 메소드
생성자 overloading을 지원이유 —>클래스로부터 객체를 생성할 때 , 필요한 변수들만 적절히 초기화 하기 위해서!!
this 예약어
-생성자나 메서드의 매개변수 이름이 객체 변수의 이름과 같은 경우 객체변수 앞에 this를 사용해서 구별
this 생성자
같은 클래스 내의 overloading 된 다른 생성자 메서드를 호출할 때 사용
메소드의 매개변수로 전달되는 데이터가 기본형이냐 참조형이냐에 따라 동작 방식이 달라지게 됨
기본 데이터 타입
값에 의한 호출(call by value)
기존의 데이터 값이 달라져도 복사한 곳의 데이터값은 변하지 않는다.
참조 데이터 타입
주소 값이 복사(call by reference)
기존의 데이터 값이 달라지면 동일한 객체를 참조하는 다른 변수의 데이터 값도 같이 변한다.
-매개변수의 숫자를 컴파일이나 실행시에 미리 지정 X
-하나의 메소드만 정의하여 매개변수의 개수를 가변적으로 사용
-메소드 선언부의 매개변수 리스트 마지막 위치에서 딱 한번만 사용 가능!
예시)
int sum (int a , int b, int c)
return a+b+c 일떄 값이 4개로 변경되는 경우 다 수정해야하는 불편함
→
int sum (int...i) {
int sum =0;
for(int i; i<num.length; i++)
sum = sum +num[i];
-기본이 되는 클래스를 확장하여 새로운 클래스를 정의 하는것 → 부모의 모든것을 자식이 물려받음
-기본 클래스, 상위 클래스 ,부모 클래스 → 확장된클래스, 파생 클래스,하위 클래스 ,자식 클래스
→Base Class, Super Class,Parent Class → Extended Class, Subclass, Child Class
-자식 클래스에서 부모클래스를 상속 받을때는 extends 라는 예약어 사용
-예시) 사원 클래스와 매니저클래스를 만들때 매니저도 사원이기 때문에 사원에 대한 정보가 필요 → 사원 클래스를 상속 받아서 사용
→사원 클래스로 부터 모든 변수들을 상속 받아서 중복되는 변수 사용 가능 , 매니저의 특징만 쉽게 찾아낼 수 있다.
⇒ 상속을 통해서 소스코드의 재사용성 보장, 가독성이 높아짐
-공통된 기능을 가지고 있다고 해서 모두 상속 가능한것 X → 부모클래스, 자식클래스의 관계가 일반화와 특별화의 관계 'is a~'의 관계에 있어야함
이러한 제약이 문법적으로 제한되는 것이 아니라 논리적으로 판단 되어야 한다.
부적절한 상속은 소스코드에 대한 분석과 개발을 어렵게 만듦!
⇒ 추가적인 것들을 확장 한다는 의미가 중요함 즉,상속은 공통적인 특징 + 추가적인 특징!
예시)
프린터 (부모) → 도트 , 레이저 ,잉크젯
public class 잉크젯프린터 extends 프린터
잉크젯 프린터는 프린터 이다.
문법적으로 단일 상속만을 허용 → 하나의 클래스는 오직 하나의 부모 클래스만 상속할 수 있다는 의미!
다중 상속을 허용하면 중복되는 변수와 메소드가 상속되는 문제가 발생
자식 클래스가 생성되면 자동으로 부모 클래스를 호출하고 초기화한다.
단, superClass에 매개변수가 있는 생성자를 정의한경우 기본 생성자가 자동으로 제공되지 않음!
super() 생성자 호출 -부모 클래스의 생성자를 명시적으로 호출할때 사용 , 부모클래스의 생성자가 overloading 되어 여러개 존재하는 경우 특정 생성자를 호출 하기 위해 사용한다.
예시)
class Shape {
int x = 0;
int y = 0;
shape() {
this(0,0);
}
shape(int x, int y) {
this.x = x;
this.y = y;
}
}
class Circle extends Shape{
int radius;
Circle(int x, int y, int radius) {
super(x,y); /이렇게 사용 ! 부모클래스의 생성자를 호출하는 super()는 반드시 생성자의 첫 라인에 위치 해야한다 !!
this.radius = radius;
}
}
⇒ 부모 클래스의 생성자가 항상 자식 클래스의 생성자보다 먼저 수행되어야함!
private으로 선언된 변수는 상속 x
자식 클래스에서 부모클래스가 가진 변수와 같은 이름의 변수를 선언하면 , 부모 클래슨의 변수는 상속 X
→ 자식클래스에서 정의한 변수가 사용됨
부모클래스의 메소드를 재사용하지 않고 새롭게 정의 하는것
상속 관계에 있는 클래스에서 자식 클래스가 부모 클래스의 메소드를 재정의해서 가지고 있는 개념
자식 클래스에서 재정의된 메소드는 부모 클래스의 메소드와 메소드 이름, 매개변수의 유형, 개수가 동일해야함
하나의 클래스에 동일한 이름의 메소드가 여러 개 중복 정의되어 있는것
메소드 매개변수의 개수나 타입이 달라야함
class Camera {
String name;
int sheets;
public void takePicture(){
System.out.println(name+ "로 " + sheets + "번 사진을 찍는다.");
}
class PolaroidCamera extends Camera{
int batteryGage;
public void takePicture() {
super.takePicture(): //overriding 한 경우 부모클래스에 정의된 메소드를 상속 받지 않기 떄문에 부모클래스의 메소드를 사용하기 위해 super를 사용하여 명시적으로 호출하여 사용.
System.out.ptintln(sheets + " 장의 사진을 프린트한다." );
System.out.println("현재 배터리 : " + batteryGage + "%");
}
}
}
Final
-f inal 예약어는 변수,메소드, 클래스앞에 붙일 수 잇는 변환자
final + 변수 → 상수
final + class → 자식클래스를 가질 수 없는 클래스
final + 메소드 → overriding을 금지하는 의미.
Write Once, Run Anyhere (WORA) (WOR Everywhere) 는 자바가 어떤 장비에서도 개발될 수 있고,, 표준 바이트코드로 컴파일되고, 자바 가상 머신이 장착된 어떤 장비에서도 실행될 수 있음을 의미한다.
.java(source Code) → compile(javac) → .class (byte Code) →excute(java) → jvm(java virtual machine) → platform(os,hw,resources)
환경 변수를 사용하는 이유는 어떤 경로에서든 특정 파일을 인식 할 수 있도록 하기 위해서
jre, jdk 차이점
jre는 jvm을 단순히 실행 하기 위한 가상머신을 포함하고 있는곳
jdk는 코드를 만들기 위해서 사용하는것
JDK에 JRE가 포함 되어 있다.
데이터 타입이란
Primitive Type 미리 정해진 크기의 Memory Size
Reference Type 미리 정해놓을 수 없는 크기의 Memory Size
변수
long ,flot 경우 뒤에 L F 를 붙어줘야함 double은 생략 가능
오류 발생)
float f;
int b;
b= b + 1; //정수 리터럴의 경우 연산 할떄 1을 vm이 4byte에 저장하고 있음
f= 1.9; // 실수 리터럴의 경우 초기화 할때부터 vm이 8byte에 저장하고 있음
쉬프트 연산자
*/ 보다 훨씬 빠름
<< >> 부호 비트를 신경씀
>>> 부호비트 신경 쓰지 않음
&&,||와 & ,|차이는
&&는 앞에서 false 가 나오면 뒤를 확인 x
& 앞뒤 둘다 수행후 비교
Scanner sc = new Scanner(System.in); // 키보드를 입력 받아서 글자로 처리할 수 있도록 도와주는 메소드
배열은 개별 요소는 다른값으로 변경가능하나 삭제할 수는 없음!
크기를 늘리거나 줄일 수 없음.
int type 기준으로 배열 만들기
int [] intArray; //선언
int intArray[]; //선언 방법
intArray = new int[5]; //생성
intArray[0] = 3; //개별 요소 값 할당
프리미티브 타입 과 레퍼런스의 타입의 차이
프리미티브 타입 자기자신의 변수 공간에 값을 저장 할 수 있다.
레퍼렌스 타입들은 힙이라는 공간에 객체를 만들고 만들어진 공간의 주소 값을 가지고 있는것
Math.random() 은 0.0~1.0미만까지 발생(double형)
System.out; //표준 출력(console)
System.in//표준 입력(keyboard)
int result = System.in.read();
System.out.println(result);
System.out.println((char)result);
//키보드로 값을 입력하면 q가 바로 나오는것이 아니라 q에 대한 코드값(정수)가 입력된다.
//q를 타이핑 하면 113이 나온다
Arrays.deeptoString을 사용하게 되면 한번에 2차원 배열도 읽어 올 수 도 있다.
int [][] a;
int[] b[];
int c[][][];
대괄호의 크기는 상관이 없다.
2차원 배열의 핵심은 탐색이다. (사방(상하좌우) 팔방(좌상상좌우, 좌,우,좌하,하,우하) 탐색)
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] data ={
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
{1,2,3,4,5},
}; //사용할 배열
for(int i=0;i<data.length;i++) {
for(int j=0;j<data[i].length;j++) {
System.out.print(data[i][j]+ " ");
}
System.out.println();
}
//상하좌우 방향 접근할 떄 사용할 인덱스 값(상,하,좌,우)
**int[] dx = {-1,1,0,0};
int[] dy = {0,0,-1,1};**
//int[][]dirs = {{-1,0},{1,0},{0,-1},{0,1}};
//data[2][2]를 기준으로 상하좌우 값 출력
for(int i=0;i<data.length;i++)
for(int j=0; j<data[i].length;j++) {
int value = data[i][j];// i,j는 현재 접근하고 있는 좌표값
if(i==0&j==0) {
for(int k=0;k<4;k++) {
//새로운 x,y좌표값 계산
**int nx = i+dx[k];
int ny = j+dy[k];**
//nx,ny가 배열 안의 값인지 체크 한 후 출력 할것!\
if(nx>=0&&nx<data.length && ny >=0 && ny<data.length)
System.out.print(data[nx][ny]+ " ");
}//k로 도는 4방 접근 for
}//if
}//j
}//i
Object-Oriented Programming
data+method 로 이루어진 구조 , Template과 같다.
class는 object들을 분석해 보고 공통적인 내용들을 추상화 해서 프로그래밍 언어로 표현한것!
object들을 보고 분류를 해서 분류의 수만큼 class를 만든다
class 사용하기
Class Type으로 변수를 선언하고, new라는 키워드를 사용 → 생성자가 옵니다.
→ 정적인 특성(attribute) member Variables
→ 동적인 특성(behavior)을 파악하는것 Methods
object는 시스템의 대상이 되는 모든것 → 학생 , 교사 ,출격
class로 부터 생성된 실체
new로 객체 생성
→Object 사용 순서
조건
생성자는 class이름 + () 의 구조를 갖고 있음
아무런 생성자를 만들지 않으면 기본생성자를 자도으로 만들어 줍니다 (default Constructor)
기본 생성자는 Parameter가 없는, 특별한 작업을 수행 하지 않는 가장 단순한 생성자
Class안에 선언된 멤버 변수들은 선언될떄 초기값을 가지고 있다 (object=NUll)을 가지고 있다
class Test{
public Test();
}
Test t = new Test();
멤벼 변수값을 외부에서 마음대로 접근할 수 없도록 하고, 대신 멤버 변수 하나에 대해 값을 set할 수 있는 method를 제공
public void setName(String name){
this.name= name;
}
멤버 변수의 값을 외부에서 일고자 할때, 직접 읽지 않고 별도의 method를 제공
public String getName() {
return name;
}
phone.name →을 막기 위해서 getter를 사용
setter와 getter를 제공 하기 때문에 멤버 변수를 선언할떄는 Private로 선언 해야한다!
⇒ 무엇보다 중요한것은 Setter와 Getters 구조를 가져가야만, 이후에 처리 로직이 변경되는 경우에 그에 쉽게 대응할 수 있다!
getter와 setter만 가지고 있는 클래스
DTO ,VO 데이터 관리를 하기 위해 사용
Method 사용 단계
class area 클래스 , 메소드를 저장하기 위한 공간
heap object를 위한 공간
stack 메소드들이 호출 되면 저장되는 공간
pass
한개의 java파일에 모든 코드를 담을 수 가 없어서 모듈별로 나누어서 관리한다
파일 계층적 구조 로 관리하기 위해서 폴더를 사용하듯이 java클래스도 패키지라는 구조를 통해 계층적으로 관리합니다
도메인의 역순 구조를 많이 사용함 → edu.ssafy.com → com.saffy.edu 와 같이 구성한다.
다른 package에 정의된 java Module을 사용하고자 할 때는 import 키워드를 사용
Import 다음에 패키지명 사용
만약, import를 사용하지 않으려면 java Module 앞에 package명을 붙여서 사용 가능
검색 해볼것
heap에 만들어져 있는 대상 → this로 지칭 가능하다.
this 생성자를 찝어낸다.
//this : new키워드로 heap에 생성된 객체
//this() 생성자 안에서 다른 생성자 호출
public,protected, private ,default
같은 패키지 안에 있으면 public protected, default를 모두 사용 가능
static이 붙어있으면 Heap안에 객체 마다 가지고 있는게 아니라 class area에 class가 등록 될때 1개만 생성된다.
→ heap에서 class area의 static 을 참조한다.
int count;//인스턴스 변수
static int scount = 999; //클래스 변수 , 여러 객체에서 공유해서 사용.
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(StaticTest.scount); // 객체 생성할 필요 없이 클래스 이름으로 바로 사용 가능
//System.out.println(count);
// StaticTest s1 = new StaticTest();
// StaticTest s2 = new StaticTest();
// StaticTest s3 = new StaticTest();
// System.out.println(++s1.count + "--" + ++s2.count + "--" + ++s3.count); // 1--1--1
// System.out.println(++s1.scount + "--" + ++s2.scount + "--" + ++s3.scount); //1--2--3
}
Static block
스태틱 블럭의 경우 main보다 무조건 앞에 실행된다.
메인이 시작되기 전에 실행되어야할것들이 스태틱 블럭에 들어있다 .
package com.basic;
public class StaticTest {
//static field
int count;
static public int scount;//1.클래스 변수
public static void go() {
System.out.println("hello, static!!!");//2.static method
}
//3.static BLOCK{}
static {
System.out.println("static block-1");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
// 객체 생성할 필요 없이 클래스 이름으로 바로 사용 가능 ->class 정보가 등록 될때 다 생성됨
System.out.println(StaticTest.scount);
// System.out.println(count);
// StaticTest s1 = new StaticTest();
// StaticTest s2 = new StaticTest();
// StaticTest s3 = new StaticTest();
//
// System.out.println(++s1.count + "--" + ++s2.count + "--" + ++s3.count);
// System.out.println(++s1.scount + "--" + ++s2.scount + "--" + ++s3.scount);
}
static {
System.out.println("static block-2");
}
}
statich method 안에서는 this , super 키워드 사용 불가
this나 super는 코드 작성후 , 컴파일 끝난 후 , 실행단 계에 생성됨
하지만 static의 경우 먼저 this 나 static보다 먼저 생성된다.
public static void main(String[] args) {
// TODO Auto-generated method stub
//static method 안에서는 this, super 키워드 사용 불가
System.out.println(this.num);
}
-값을 저장하는것이 목적인 Object
public class Book {
private String isbn;
private String title;
private String author;
private String publisher;
private int Price;
private String desc;
public Book() {
}
→저장된 데이터를 관리 하는 Object
public void addBook(Book b) {
// System.out.println(b.getIsbn());
if(cnt < MAX) {
bookList[cnt++] =b;
// bookList[cnt].setIsbn(b.getIsbn());
// bookList[cnt].setTitle(b.getTitle());
// bookList[cnt].setAuthor(b.getAuthor());
// bookList[cnt].setPublisher(b.getPublisher());
// bookList[cnt].setPrice(b.getPrice());
// bookList[cnt].setDesc(b.getDesc());
}
}
public void remove(String isbn) {
for(int i=0;i<cnt;i++) {
Book one = bookList[i];
if(one.getIsbn().equals(isbn)) {
bookList[i] = bookList[cnt -1]; //맨마지막 값을 가지고 오고
bookList[cnt -1] = null;//맨 마지막 값을 null로 바꿔주고
cnt--; //카운트를 하나 줄임
break; //목표 를 삭제한 뒤에 break문으로 종료
}
}
}
SingletonPattern
→ 디자인 패턴중에 하나인 싱글톤 패턴은 하나의 객체를 공유 하면서 사용하는 디자인 패턴이다.
자기 자신의 타입의 변수를 선언하는 이유는 나중에 manager라는 요청이 있을때 사용 하기 위해서