190412 5일차 Escape Character,printf, OOP, 오버라이딩, 오버로딩, 생성자
class GugudanPrintTest2
{
public static void main(String[] args)
{
System.out.println("Hello World!");
for(int i = 1; i < 10; i++)
{ //반복문 for 규칙적인 수, 바깥for문 : 기준 (고정)
for(int dan=2; dan < 10; dan++)
{
System.out.print( dan + " X " + i + " = " + (dan*i) + " ");
//공백(WhiteSpace) : 한개 이상의 스페이스(한칸), 탭(일정간격), 엔터의 조합
System.out.println();
}
/*
<Escape Character> Escape Sequence
-특수문자, 확장문자
-기능을 갖는 확장된 문자
-주의 : 인용부호내에서만 사용해야 함, 인용부호는 작은따옴표 큰따옴표를 말함
\n : new line, Line Feed(LF), 줄바꿈
\r : Carriage Return(CR), 커서의 위치를 맨 앞으로 이동.
\t : Tab, 일정간격 띄우기
\\ : '\'문자표현
\" : 큰따옴표
\' : 작은따옴표
*/
}
}
자바 OOP(Object Oriented Programming)
<객체지향의 특징>
-
캡슐화 : 필드와 메소드를 묶어주는 것
- 정보은닉
- 모듈성
-
상속 ★
-
부모가 갖는 자원( 필드, 메소드 )을 아낌없이 물려주는 것
-
관련 키워드
- extends
예시
class My extends 상속받고싶은 부모클래스명 { //extends 는 is a 관계를 갖는다. }
class Parent extends Object //import java.Object 과 같음 , 컴파일러가 자동 추가 { } class Child exdends Parent { } /* 질문) Parent p = new Child(); Child c = new Parent(); 이렇게 하려면, 에러가 발생하고 하나는 실행되는데 그건 Parent p = new Child(); 자식은 부모다, 자식은 언제든 부모가 될 수 있다, 하지만 부모는 자식이 될 수 없다. 자바의 자식은 불효자!, */
-
단일상속이 기본 원칙.
-
API문서( Application Programming Interface )
=>>
java.lang.Object //부모클래스, 상위 클래스 super class
|
+– java.lang.String //자식클래스, 하위 클래스, sub class
※Object 클래스 =>> 최상위 클래스
-
-
다형성 ★★
-
메소드 오버라이딩(MethodOverriding) ★★ =>> 메소드 재정의
부모가 갖는 메소드를 울타리처럼 가져오는게 상속인데 그걸 자식이 재정의 할 때
- 혹은 기존기능은 그대로 덧붙이는것
상속에서 나온 개념, 상속과 연관
부모가 갖는 메소드를 자식클래스에서 재정의
- 메소드 오버로딩
동일한 하나의 클래스에 동일한 이름의 메소드를 여러개 구현
( 단, 인자의 갯수가 다르거나 자료형이 달라야 한다.)
매개변수의 개수 또는 타입이 달라야 한다.
매개변수는 같고 리턴타입이 다르다고 오버로딩이 성립하지 않는다.
class A { void hello() { } void hello() { //에러 발생 } }
class A { void hello() { System.out.println("안녕") } void hello(String name) { System.out.println("안녕," + name + " !! ") //인자 name을 쓰기 때문에 사용 가능! } }
class Parent // extens Object가 생략된것 { int x = 100; void hello() { } } class Child extends Parent { int y = 200; void goodbye() { } } /* 1. Parent p = new Parent(); //new 는 동적 메모리 할당 new가 Parent(); 오른쪽으로 감 , p는 Parent 왼쪽으로 감 메모리 : 페어런트, 오브젝트 2. Child c = new Child(); child(); 에 new로 메모리 할당 c는 chile에 대해서 참조 메모리 : 차일드, 페어런트, 오브젝트 3. Parent p2 = new Child(); 또는 Parent p2 = c; // c는 2번에 있던 c , 위 아래는 같은 식이다. int su = 33; A a = new A(); a. hello(); // 이거랑 new A().hello(); //는 같은것임 하지만 이렇게 같은데 다르게 쓰는 이유는 new는 계속 메모리를 할당하기 때문에 2번이상 나온다면 a. 을 사용하는게 더 좋음 Parent p2 = new Child(); 앞뒤로 달랐을때 p2 는 parent 참조, new는 메모리 할당 p2.hello(); 는 parent 참조하기에 에러 안남 p2.toString(); 도 Object에 있기에 에러 안남 p2.goodBye(); 는 에러, 메모리는 할당되어있으나 참조가 Parent로 되어 있기에... 부모 참조 변수를 통해 자식 호출 불가! 반대로 자식 참조 변수를 통해 부모 호출 가능!(메소드 호출말하는 것) 4. Child c2 = new Parent(); // 부자는 가능하지만 자부는 안된다! new Parent 하면 메모리에는 Object와 Parent가 할당 되는데 Child를 참조한다고?! 메모리에 없어 에러! Child c2 = p2; //에러 Child c2 = (Child)p2; //는 에러 아님, 캐스팅(형변환) Child c3 = (Child)new Parent(); //컴파일때는 에러 안나지만 실행할때 에러 부 = 자 아니면 안된다 대부분... */ class Parent // extens Object가 생략된것 { int x = 100; void hello() { System.out.println("신짜오"); } } class Child extends Parent { int y = 200; void goodbye() { void hello() { System.out.println("신짜오"); } } } /* p2.hello() 실행하면 신짜오가 실행된다. 오버라이딩 메소드만 자식클래스 메소드 호출 가능! 무조건 위를 참조하지만 오직 오버라이딩만! 자식클래스 메소드를 호출한다. 다형성! */
//컴파일러가 import java.lang.*; 추가 class Parent // extends Object 추가 { int i = 11; void hello() { System.out.println("부모 안녕!"); } void print() { System.out.println("부모 프린트~!"); } void hello(String name) // ----> ? 오버로딩 메소드 ( 메소드명 같고 인자의 갯수 또는 자료형이 다른것) { System.out.println("부모 안녕! 스트링" + name); } void print(int age) { System.out.println("부모 안녕! 인트" + age ); } } class Child extends Parent { // is a 관계 =>> 자식은 부모다! // =>> 자식클래스는 부모클래스로 형변환이 가능하다!! int j = 22; void goodbye() { System.out.println("자식 안녕히가세요"); } void print() //오버라이딩 { System.out.println("자식 프린트~!"); } } class InheritanceTest { public static void main(String[] args) { Parent p = new Parent(); //메모리 할당 : O P //참조별수 p Child c = new Child(); System.out.println( " j " + c.j); //부모 자식 //Parent p = new Child(); //에러발생, 호환이 되지 않는 자료형, 변환할수 없습니다 에러 => extends Parent //--- ---------- //기준 변환가능한지 여부? //c.abc(); 에러 child, parent, Object 클래스에 순차적으로 확인후 존재하지 않기 때문에 에러 c.toString(); // Object클래스에 toString(); 메소드가 정의 되어 이씩에 에러 발생 안함. System.out.println( "=================" ); //자기 자신의 자원 호출 p.hello(); System.out.println( "=================" ); //p.print(); //p.goodbye(); 에러발생 //기본 : 부모참조변수(p)를 통해 자식 접근 불가능! but 오버라이딩 했다면 접근 가능 오직 이것만! System.out.println( "=================" ); Parent p2 = new Child(); // 메모리 할당 : O P C //---- ----------- //참조 변수 : p2 //기준 변환 가능 여부? p2.hello(); p2.print(); // 기본원칙 : 부모참조 통해 자식 호출 불가! // ★ 예외! 오버라이딩의 메소드의 경우에는 호출 가능~ // =>> 정확히 // =>> 오버라이딩 메소드가 존재한다면, 부모의 메소드는 은폐되고 자식의 메소드로 대체된다. System.out.print( p2.i); // i는 변수임으로 그냥 부모 변수 가져감, 오버라이딩은 오직 메소드에 대한 것임. } }
-
<생성자> Constructor
-
새로운 객체를 생성하기 위해서 초기화해주는 메소드
- 생성자의 이름은 반드시 클래스명과 일치( 대소문자 일치 )
- 리턴자료형을 명시하지 않는다. (void조차 명시하면 안된다.)
- 1번, 2번이 일반 메소드와의 차이점
- 객체 생성시 자동으로 호출
- 클래스내에 생성자가 하나도 없다면 자바컴파일러가 컴파일시 ( 기본생성자를 )자동으로 추가.
※주의 ) 만약, 클래스내에 한개 이상의 생성자가 정의 되어 있다면 컴파일러는 소스코드에 관여하지 않는다.
class Abc
{
int su;
My my;
Abc( ) //기본생성자(매개변수 비어있는 생성자); 이름 클래스와 일치, 자료형 리턴자료형 없어야 한다.
{
//=>>초기화 (값 할당) 메소드
// 멤버작업에 대한 초기화 작업
su = 10;
my = new My();
//(일반메소드 호출 전 1번 실행 하야 하는) 선행작업은 여기에 넣기.
}//생성자
Abc( ) //또 메소드 같은거 쓰면 에러
{
}
Abc( String name ) //오버로딩 생성자
{
}
ABc( int age ) //컴파일 에러 발생 : 클래스명과 일치하지 않으므로 일반메소드!, 리턴자료형을 명시하지 않았음! 이라고 에러가 남
{
}
void hello()
{
}
}/*class Abc();
==================
Abc a = new Abc( );
a.hello(); 기본 생성자 호출
*/
a.hello();
/*
Abc a2 = new Abc( "길동" )
====== 오버로딩 생성자 호출!
*/
a2.hello();
class Abc
{
int su; //멤버변수(필드) - 여러 메소드가 공유할 데이터를 표현, 기본값이 존재 O
//기본값 =>> 정수:0 실수:0.0 논리:false 클래스:null
Abc() //기본생성자
{
System.out.println("Abc기본생성자"); //먼저 시작됨!
}
Abc(String name)
{
System.out.println( "Abc오버로딩생성자" );
}
void hello()
{
int min; //지역변수 - 현재 메소드에서만 사용할 데이터를 표현, 기본값이 존재 X
//min = 0; 지역변수는 반드시 초기화 해서 사용!
System.out.println( "초콜릿 안녕" );
}
} //class Abc
class ConstructorTest
{
public static void main(String[] args)
{
Abc a = new Abc();
// 1. 메모리 할당 2. 생성자 호출
a.hello();
System.out.println( "" ) ;
}
}
//하지만 우리가 생성자 만드는 일은 드물다, 하지만 생성자를 알아야 그것에 많게 객체생성을 할 수 있기에 우리는 배웠다.
궁금상자
- 한개의 글자가 스페이스 한칸을 의미하는가?...
구구단할때 스페이스로 했지만, 다른것에서는 문자 숫자 합쳐 나올텐데...
그리고 의아한게 \t은 스페이스 4칸인데 한자리수 뒤도 4칸 두자리수 뒤도 4칸이면 라인이 깨져야 하는거 아닌가?
- print println printf 밖에도 다른?! printf 에서 f의 의미
printf 의 f의 의미는 format string 이다. 서식화된 출력이라는 뜻
- 오버로딩은 if같은거 아닌가? 인수가 들어오면, 인수 포함된 메소드 들어오고 아니면 인수 없는 메소드 시작하고
오버로딩 사용 하지 않으면, 이름 다 제각각 지어줘야 하고(int일때, float일때, double일때), 메소드명만 봤을때 메소드들이 같은 기능을 하는지 모를 수 있다. 하지만 오버로딩 사용하면 메소드 이름이 같으니 같은 기능이구나! 알 수 있고 이름도 안지어도 된다!
https://java.ihoney.pe.kr/99
- Parameter(인자, 매개변수), Argument(인수)
Parameter는 함수 선언에 사용되는 입력 변수
Argument는 함수 호출에 사용하는 입력 변수
- 자바의 인자와 매개 변수의 차이점
인자는 함수를 호출할때 값을 전달하는 것 1, 2, 5 int func(b)의 b처럼
매개변수는 함수 내에서 전달 된 값을 받아 들이는 변수 int a나 int b처럼
https://yangyag.tistory.com/24
선생님께 인자 인수 매개변수를 다시 한번 여쭤보자
- 오버로딩에서 hello(int a){} hello(int b){} 가능한가?인자의 갯수도 같고, 타입도 같은데?
응 안됨, 인자 갯수가 다르거나 타입이 달라야 한다.
'클라우드 기반 웹 개발자 과정 공부 > JAVA' 카테고리의 다른 글
190415 Day7 this, interface, mission, 배열, 자바빈즈, 추상클래스- (0) | 2019.04.16 |
---|---|
190415 Day6 이클립스 설치, 접근지정(제한)자, 자기참조연산자, 인터페이스, final, 클래스와 인터페이스 간의 상속 문법 (0) | 2019.04.15 |
190411 Day4 자바의 입력 (0) | 2019.04.11 |
190410 Day3 조건문 이어서, 반복문 (0) | 2019.04.10 |
190408 Day2 주석문, 구성요소 사용법, 연산자, 조건문1 (0) | 2019.04.09 |