super 클래스는 항상 자식 생성자의 첫번째 디폴트에 생략되어 있다 == : 위치비교 .equals( ) : 값 비교 final class : 상속 금지 - 확장 불가 -> has ~a관계 가능 final method : 오버라이딩 금지 final 변수 : 값 변경 금지 -> 상수 추상 메소드 - 공통된 이름만 제공 -> 자식이 기능을 만들어야함 (강제성) - 객체를 만들 수 없다 - 추상 클래스를 객체로 만들 수 있는 예외적인 경우 : anonymous inner class -> 이벤트 처리 - C++에서 순수 가상 함수와 같은 기능을 한다 - 미완성 메소드 - 여러개를 받을 수 있는 interface를 선호
import java.util.Scanner; public class Calc { // 재귀 public static int calc(String input) { int pos; // indexof(); - 문자가 없으면 -1반환 pos = input.indexOf('+'); // +의 위치를 알려줘! System.out.println(input); if (pos != -1) { // 문자가 있으니까 -1이 아니여야 함 return calc(input.substring(0, pos)) + calc(input.substring(pos + 1)); } else { pos = input.indexOf('-'); if (pos != -1) { return calc(input.substring(0, pos)) -..
성적 처리 프로그램 1. 입력 - 한명씩 2. 전체 출력 / 오름차순으로 출력 3. 검색 - 이름 검색 / 성적 (국어, 영어, 수학, 총점) 검색 4. 수정 - 이름을 받아서 각 과목 수정 5. 삭제 - 이름을 받아서 삭제 import java.util.Scanner; class Name { //이름 private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } } class Score { //점수 private int score; public int getScore() { return score; } public void setScore(int score)..
배열 : 동일한 데이터 타입을 순차적으로 저장 장점 : 일괄처리 int [ ] arr; -> 스텍이라는 공간에 arr이라는 공간이 생김 arr = new int[5]; -> 힙 영역에 5개가 생긴다 Stack 영억 ↙ Heap 영역 public class Array { public static void main(String[] args) { //for-each int a[] = {1,2,3,4,5,6}; for(int i :a) { System.out.println(i); } } } 2차원 배열 public class Array { public static void main(String[] args) { //2차원 배열 //arr[0] = new int[2]; //arr[1] = new int[7]; i..
this : 자기 자신을 참조하는 레퍼런스 변수 - 인스턴스 메소드에 첫번째 인자에 존재 사용 - 자기 자신을 return 할 때 -> 반복 처리 public class ThisCall { private int a; private int b; public ThisCall() { this(0, 0); System.out.println("디폴트 생성자"); // a = b = 0; } public ThisCall(int data) { this(data, 0); System.out.println("생성자 -> " + data); //a = data; //b = 0; } public ThisCall(int data1, int data2) { System.out.println("생성자 -> " + data1 + ..
static : 객체를 만들지 않음 클래스 : 첫글자가 대문자로 시작 자바는 100% 상속구조이다 - extends object를 안해줘도 object를 상속 받고 있다 #JAVA의 char는 2byte 객체를 만들 때에는 무조건 ( )를 선언해줘야 한다 대,소문자를 구별한다 - static : 모든 객체가 공유한다 - 메모리를 낭비하지 않기 위함 'private static 필드명' 을 사용하고 싶을 때, static 메소드를 통해서 사용한다 필드 : 메소드를 통해 사용한다 ex) setter, getter 메소드 : 외부에서 필드를 접근 할 수 있게 권한을 줌 자바에서는 포인터 개념이 없다 -> 레퍼런스 변수를 포인터 대신으로 사용하는 개념
템플릿 - 다형성의 종류 중 하나 - 일반화 프로그램 -> 타입 제한이 없다. 즉, 타입을 지정해 줄 수 없다 기본 형태 template 종류 1. Template 함수 - C++에서만 존재 -> JAVA에서는 없다 #include "stdafx.h" #include #include using namespace std; template void change(T &t1, T &t2); void main() { int a = 1, b = 2; char c = 'A', d = 'B'; float e = 3.7f, f = 4.3f; change(a, b); cout
string을 사용하지 않고 string 역할을 하는 객체를 생성하여 사용 #include "stdafx.h" #pragma warning(disable:4996) #include #include using namespace std; class MyString { char *str; //문자 메모리 공간 할당 int len; //문자열 길이 저장 변수 public : MyString() { len = 0; str = NULL; } //소멸자 ~MyString() { delete[] str; } //1번 MyString(const char *p) { //문자열 길이 구하기 len = strlen(p) + 1; //길이를 알려주는 함수 -> null이 빠지기 때문에 +1을 해줌 //메모리 할당 str = n..
연산자 함수 : 객체를 가지고 연산 처리를 할 수 있게 해주는것 - 값 + 객체 - 원래 의미를 바꾸지 말라 -> 이유 : 동적 메모리 할당 - 새로운 연산자를 만들면 안된다 - friend를 많이 쓰는 대표적인 함수 기본 형태 리턴타입 operator 연산자(매개변수 리스트); #default로 존재하는 함수 - 생성자 소멸자 복사 대입연산자 中 대입연산자 사용 #복사 생성자 : 객체 생성 할 때 객체를 대입하기 위해 만듬 #대입 : 객체 생성 이후에 객체를 대입하는것 방법 1. 멤버 함수 - this가 있다 : 자기 자신으로 넘길 수 있다 #include "stdafx.h" #include using namespace std; class A { int a; public : A(int a = 1000)..
friend - 접근 지정자에 상관없이 모두 public으로 인식하여 사용한다 - 캡슐화의 파괴 주범 - 코드의 확장을 위해 사용 - 원래 내꺼가 되어야 하는데, 접근할 수 없을 때 사용 -> 다 접근할 수 있게 권한을 줌 - 연산자 함수에서 사용 ex) 3 + 객체 관계 1. friend class 2. friend method : 객체 안에 있는 특정 메소드만 friend 적용 3. friend function : 외부함수에서 접근 - 가장 많이 씀 - class A가 있고 class B가 있을 때, class A에 아무곳에 friend B; 라고 선언하면 B에 접근이 가능 #include "stdafx.h" #include using namespace std; class A { int money; ..
stack - FILO : First In Last Out - 처음에 넣는 값이 제일 나중에 나온다 queue - FIFO : First In First Out - 처음에 넣는 값이 제일 처음에 나온다 Stack Queue Memory #include "stdafx.h" #include using namespace std; class Memory { protected: int *m; public: int count = 0; Memory() { m = new int[20]; } virtual ~Memory() { //생성자 함수와 소멸자 함수는 세트 delete[] m; } void push(int i) { //stack과 queue의 공통적을 데이터를 넣는 일을 하는 함수 if (full()) { m[c..
가상 함수 - 추상 메소드의 한 종류 - 많이 쓰면 쓸수록 메모리 낭비가 생길 수 있다 - 사용자가 동적 바인딩을 항상 쓰지 않기 때문에 가상 함수를 쓴다 - 오버라이딩을 할 때 무조건 가상함수를 쓴다고 생각하면 된다 int a int b *vptr 가상함수를 사용하면 *vptr의 공간이 생긴다 소멸자에서 무조건 생성해야함 #include "stdafx.h" #include using namespace std; class A { public : A() { cout
동적 바인딩 : 부모가 자식을 접근하는 방식 - 포인터를 사용 - is ~a 관계일때만 사용 가능 //has ~a로 상속받으면 오류 - 동적 바인딩과 정적 바인딩의 방식은 다르지만, 결과는 같아야 한다 - 부모가 인식할 수 있는 범위까지만 사용가능하다 ->즉. 부모만 가지고 있는 경우, 또는 오버라이딩한 멤버만 접근 가능 정적 바인딩 : 내꺼를 가지고 접근 장점 1. 자식이 여러명일 때 2. 코드를 간략하게 짤 수 있다 #include "stdafx.h" #include using namespace std; class A { public : virtual void disp(); //함수 선언 void ccc() { cout
동적 바인딩 - 부모의 포인터로 자식을 접근하는 방식 - is ~a 관계일때만 사용 가능 //has ~a로 상속받으면 오류 - 동적 바인딩과 정적 바인딩의 방식은 다르지만, 결과는 같아야 한다 정적 바인딩 : 내꺼를 가지고 접근 단일 상속을 원칙으로 하되, 필요에 의해 다중 상속을 한다 #다중 상속 할때, 상속 방식을 꼭! 명시해야함 - private으로 자동으로 상속됨 다중 상속의 복잡성 만나는 구조로 상속을 받으면 같은게 2개를 상속 받아 쓰므로 터짐! -> 해결 : 가상상속 다중 상속 가상 상속 D가 어떤 부모 클래스 (B, C)를 사용할지에 따라 A를 사용하는 클래스가 지정되어 사용된다 다중 상속 주의점 1. 상속 방식을 명확하게 기재 2. 모호성 조심 -> 발생할 수 밖에 없는 상황이라면 가상 ..
클래스 관계도를 이용해서 급여 관리 프로그램 만들어보기 상위 데이터 클래스 #include "stdafx.h" #include #include #include #include using namespace std; class Info { //Info에 대한 정보를 넣는 data 클래스 string info; public: void setInfo(string info) { this->info = info; } string getInfo() { return info; } }; class Money { //Money에 대한 정보를 넣는 data 클래스 float money; public: void setMoney(float money) { this->money = money; } float getMoney() ..
클래스 관계 1. has ~a : 클래스의 내용을 가져다 쓴다 - data와 관리 class - 포함 object - 제일 많이 쓰는 방식 #include "stdafx.h" #include #include #include using namespace std; //has ~a 관계 class A { string name; public : A() { //디폴트 생성자 cout name = name; } string getName() const { return name; } }; class B { A aa; //포함 object int age; public : B() { cout age = age; } int getAge() const { return age; } //A를 가져다 쓰기 void setName..
const #레퍼런스 변수는 한번 참조하면 바꿀 수 없기 때문에 선언과 동시에 초기화를 해야한다 const도 레퍼런스와 마찬가지로 선언과 동시에 초기화를 해줘야한다 필드는 문법적으로 초기화를 시키지 못하기 때문에 콜론 초기화를 해준다 사용 목적 주로 사용자 캡슐화 목적으로 사용 1. Field - 필드 - 선언과 동시에 초기화를 해줘야 하는데 할 수가 없다 - 콜론 초기화 기법을 사용한다 - 깂을 읽기만 가능하다 # 콜론 초기화 : const와 필드 초기화 - this 대신에 사용하는 개념 #include "stdafx.h" #include #include using namespace std; class A { const int a; int b; public : A():a(10), b(20){ //생성자..
static method 생성시기 : 맨 처음 특징 1. class를 통 틀어서 오직 하나다 2. this pointer가 존재하지 않는다 3. instance field를 사용할 수 없다 기본 형태 클래스명::메소드( ); 객체.메소드( ); //객체를 만든 후 # :: - 범위 지정 연산자 (스코프) : 클래스 이름과 static 멤버 사이에서 static 멤버를 접근하기 위해 사용 #include "stdafx.h" #include #include using namespace std; class A { public : static void disp() { cout
this - JAVA : 자기 자신을 가리키는 레퍼런스 - C++ : 자기 자신을 가리키는 객체 포인터 - 인스턴스 함수의 첫번째 매개 변수에서 존재 -> 객체를 만들어야함 #static : 객체를 만들지 않아도 됨 #인스턴스 메소드 : 객체를 만들어야만 쓸 수 있는 메소드 -명시적으로 사용할 경우 -> 필드명과 지역변수가 같으면 무조건 this.을 써준다 -> 메소드에서 자기 자신을 리턴할때 사용 -> 반복적인 일을 할 때 #static 메소드에서 필드 값을 초기화 할 수 없다 -> this를 만들 수 없기 때문 - 쓰고 싶으면 생략 되어있는 것을 코딩 call by adress #include "stdafx.h" #include #include using namespace std; class A { ..
클래스 : 추상적인 것을 객체화 시킨 것 #객체 : 사람이 정의할 수 있는 모든 것 절차 지향 : 순서에 의해서 진행 -> C 스타일 객체 지향 : 확장성, 유지보수성이 가장 중요! 기본 형태 class 클래스 이름 { //내용 }; //세미 콜론 필수! 클래스 안에 들어가야할 내용 1. Member variable - 멤버 변수 // Field 2. Member function - 멤버 함수 // Method 3. Constructor - 생성자 default로 정의되는 함수 1. 생성자 함수 : 객체 등록 시 자동으로 호출되어지는 함수 - 역할 ㉠ 객체 필드 초기화 -> 쓰레기 값 방지 ㉡ 객체 등록 -> default - 접근 지정자는 주로 public을 사용 ( 필수는 아님 ) -> 외부 함수에서..
스레드 : 프로세스 내에 있으며, 운영체제가 CPU에 실행하도록 스케줄하는 기본 단위 Thread안에 Runnable 인터페이스가 참조 변수로 들어가있다 Runnable은 run( ) 메소드 하나만 정의되어 있다 1. Thread 클래스 사용 기본 형태 class 클래스 이름 extends Thread { public void run( ); // 구현 } 선언한 클래스 안에서 run( ) 메소드를 사용하기 위해 Thread 클래스를 상속 받아 씀 public class ThreadEx extends Thread { //Thread 클래스 상속 public void run() { while(true) { System.out.println("스레드 예시"); } } } 2. Runnable 인터페이스 사용 ..
오버로딩 : 동일한 함수명으로 여러개의 함수를 제공 조건 1. 함수명은 같지만, 매개변수의 타입이나 갯수가 달라야한다 2. 리턴 타입은 상관없다 종류 1. 명시적 오버로딩 : 함수명은 같고, 매개변수나 파일의 갯수에 의해 구별 ex) void disp ( int a, int b ); void disp ( int a ); void disp ( ); => 함수가 3개 2. 암시적 오버로딩 : 한개의 함수로 여러개를 표현 - default 인자 값을 가질 수 있다 -> 내가 어떤 값을 주겠다 ex) void disp ( int a = 0, int b = 0 ); => 명시적 오버로딩의 예시를 하나로 만든것 disp ( 10, 20 ); disp ( 10 ); // disp ( 10, 0 ); disp ( );..