달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2011. 1. 25. 23:06

[면접정리]객체지향에 대해서 설명 Study/Java2011. 1. 25. 23:06

객체지향이론의 기본 개념은 '실제 세계는 사물(객체)로 이루어져 있으며,

 발생하는 모든 사건들은 사물간의 상호작용이다.'라는 것이다.

객체지향은 다음과 같은 특성을 갖는다.

상속(‌Inheritance),캡슐화(encapsulation),다형성(polymorphism),추상화(abstraction)

객체지향프로그래밍의 장점은 첫번째로 코드의 재사용에 따른 생산성 향상에 있다. 

한 프로그램내의 sub class 들이 super class 속성을 표현한 코드를 재사용하며 그에 따라 생산성이 증대한다. 

두번째는 Natural Modeling에 있다. 즉 객체 클래스 상속 다형성 등 우리의 일상생활에서 보통적으로 생각하는 방식을 

그대로 프로그램 언어로 표현한다.

세번째로는 유지보수가 좀 더 편하다. 

기존 기능을 수정 시 함수를 새롭게 바꾸더라도 캡슐화와 그 함수의 정보가 은폐되어 있어 미치는 영향을 최소화한다. 

네번째로는 신뢰성이 높다. 

제어자와 메서드를 이용 데이터를 보호하고 올바른 값을 유지하도록 하며 

코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지한다.

단점으론 설계를 잘해야 하며 속도가 느리다는 단점이 있다.
:
Posted by 유쾌한순례자
2011. 1. 25. 21:39

IP변환배치파일 작성 Study/ETC2011. 1. 25. 21:39

netsh interface ip set address name="로컬 영역 연결" static 아이피주소 서브넷 게이트웨이 1


ex) 아이피 2.1.1.2
서브넷 255.255.255.0
게이트 2.1.1.1

netsh interface ip set address name="로컬 영역 연결" static 2.1.1.2 255.255.255.0 2.1.1.1 1
:
Posted by 유쾌한순례자
대부분 레지스트리에 uninstall 에서 체크하기 때문에 여기에 있는 해당 프로그램을 지워주면 된다.

위치는

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

:
Posted by 유쾌한순례자
갑자기 php로 개발하게 되버려서 회원가입시 비밀번호 체크 부분을 구현해둔 것 정리.

ajax 처리를 하는 JS 부분

function requestPassword(){

if(document.regForm.password.value == document.regForm.password1.value){
request = getXMLHttpRequest();
request.onreadystatechange=responsePassword;
var url = "./action/checkPassword.php";
var param = "password=" + document.regForm.password.value + "&password1=" +document.regForm.password1.value;
//alert(param);
request.open("POST",url,true);
request.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded;charset=utf-8");
request.setRequestHeader("Cache-Control","no-cache, must-revalidate");
request.setRequestHeader("Pragma","no-cache");
request.send(param);
}else{
document.all.passMsg.innerText="  비밀번호가 일치하지 않습니다.";
document.regForm.password.value="";
document.regForm.password1.value="";
document.regForm.password.focus();
}
}


function responsePassword(){
if(request.readyState == 4){
if(request.status == 200){
var text = request.responseText;
var msg = null;
if(text=="0"){
msg = "  비밀번호는 영문/숫자/특문 포함 8자리 이상입니다.";
document.regForm.password.value="";
document.regForm.password1.value="";
document.regForm.password.focus();
}
else{
msg = "  사용가능한 비밀번호 입니다.";
}
document.all.passMsg.innerText = msg;
}
else{
alert("실패");
}
}
}

그 다음 간단한 정규식으로 체크한 ./action/checkPassword.php 부분

<?
$password = $_POST["password"];
$password1 = $_POST["password1"];
if(preg_match('/[0-9]/',$password) && preg_match('/[a-zA-Z]/',$password) &&                                              preg_match('/[^0-9a-zA-Z]/',$password) && strlen($password)>=8){
echo "1";
}
else{
echo "0";
}
?>


'Study > JS&Ajax' 카테고리의 다른 글

jsbin 2.9.x 커스텀 단축키부분 분석  (0) 2012.10.02
jsbin2.9.x 커스텀 연구  (0) 2012.10.02
:
Posted by 유쾌한순례자
2010. 12. 13. 13:25

제네릭스 (Generics) <발행 No. 공개 No.> Study/Java2010. 12. 13. 13:25

제네릭스는 다양한 타입의 객체들을 다루는 메소드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능이다.

JDK 1.5 로 업 해서 사용할때 가장 적응 안되고 지금도 잘 모르겠고 이러한 부분이다.

자바의 정석 과 기타 인터넷 자료들을 참고하여 정리해두고 계속 봐야 겠다.

참고사이트 : http://cafe.naver.com/javachobostudy/37197
http://www.ibm.com/developerworks/kr/library/j-jtp04298.html#author

참고서적 : 자바의정석  576p ~

정리시작!

컬렉션클래스 <저장할 객체의 타입> 변수명 = new 컬렉션클래스 <저장할 객체의 타입>();

그리고 이게 좋은게 저장된 객체를 꺼낼 때 형변환이 필요가 없다고 한다. (왜냐하면 이미 알고 있기때문에..)

상위 타입을 지정해서 할 수 도 있고..

ex) 자바의 정석 예제에서 발췌

class Product{}
class Tv extends Product{}
class Audio extends Product{}

// Product클래스의 자손객체들을 저장할 수 있는 ArrayList를 생성

ArrayList<Product> list = new ArrayList<Product>();

list.add(new Product());

list.add(new Tv()); // 컴파일 에러가 발생하지 않는다.

list.add(new Audio()); // 컴파일 에러가 발생하지 않는다.

ArrayList가 Product타입의 객체를 저장하도록 지정하면, 이들의 자손인 Tv와 Audio타입의 객체도 저장할 수 있다.

다만 꺼내올 때 원래의 타입으로 형변환해야 한다.

제네릭스에서도 다형성을 적용해서 아래와 같이 할 수 있다.

List<Tv> tvList = new ArrayList<Tv>(); // 허용

그러나 Product클래스가 Tv클래스의 조상이라 할지라도 아래와 같이 할 수는 없다.

ArrayList<Product> list = new ArrayList<Tv>(); // 허용 안함~!!!

그래서 아래와 같이 메서드의 매개변수 타입이 ArrayList<Product>로 선언된 경우

이 메서드의 매개변수로는 ArrayList<Product>타입의 객체만 사용할 수 있다. 그렇지 않으면 컴파일 에러가 발생한다.

public static void printAll(ArrayList<Product> list){
System.out.println("test");
}
public static void main(String args[]){
ArrayList<Product> productList = new ArrayList<Product>();
ArrayList<Tv> tvList = new ArrayList<Tv>();
printAll(productList);
printAll(tvList); // 컴파일 에러


음 그러니까 선언이 된걸로만 사용이 가능하다.!

컬렉션 클랙스 뿐만 아니라 iIterator 에도 적용된다.


:
Posted by 유쾌한순례자
2010. 12. 12. 02:08

static 멤버 클래스를 많이 사용하자 Study/Java2010. 12. 12. 02:08

중첩클래스는 다른 클래스 내부에 정의된 클래스이다. (외곽 클래스를 지원하는 목적으로 존재함)

네 가지 종류가 있는데 static 멤버 클래스 , static이 아닌 멤버 클래스 (인스턴스 클래스), 익명 클래스, 지역 클래스이다.

static 멤버 클래스는 다른 클래스의 내부의 선언되어 있고 외곽 클래스의 모든 멤버들(private으로 선언된 것까지)을 사용.

ex)
public class innerClassTest {
static class staticTest{
private static int a = 10;
}
public static void main(String args[]){
System.out.println(staticTest.a);
}
}

결과값 : 10

인스턴스 클래스의 각 인스턴스는 자신을 포함하는 외곽 클래스의 인스턴스와 은연 중 연관되는데

static이 아닌 멤버 클랫의 인스턴스 메소드 내부에서 외곽 클래스의 인스턴스 메소드를 호출하거나,

또는 this 키워드를 사용해서 외곽 클래스의 인스턴스에 대한 참조를 얻을 수 있다.

ex)
public class innerClassTest {
private int b = 20;
static class staticTest{
private static int a = 10;
int c = b;  //오류가 남.
}
class instancetest{
int d = b; //정상실행
}
public static void main(String args[]){
System.out.println(staticTest.a);
}
}
※ 외곽 클래스의 인스턴스를 사용할 필요가 없는 멤버 클래스를 선언한다면, 항상 static 멤버 클래스로 만들자.
-->Why?) static을 생략시 각 인스턴스가 외곽 클래스의 인스턴스 참조를 갖게 되며 이러한 참조 저장은 시간과 메모리가 
               소요 되며, 가비지 컬렉션 대상이 될 외곽 클래스의 인스턴스가 메모리에 계속 남아 있게 된다.

익명 클래스는 선언된 곳에서만 인스턴스를 생성할 수 있으며 instanceof 연산자로 타입 검사를 할 수 없다.

또한 하나의 익명 클래스에 여러 개의 인터페이스를 구현하기 위해 선언 할 수 없으며

오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현 할 수 있다.

지역 클래스는 가장 적게 사용되며 지역 변수가 설정 될 수 있는 곳{} 으로 둘러 쌓인 메소드나 블록이면 이면 어디든 선언!
:
Posted by 유쾌한순례자
태그 클래스를 클래스 계층으로 변환하려면 태그 값에 따라 달라지는 각 메소드를 추상 메소드로 만들고

추상클래스를 정의한다.

태그 값에 관계없이 동작하는 메소드 는 추상 클래스에 포함한다.

만일 모든 종류의 인스턴스들이 사용하는 필드들이 있다면 그것들도 추상클래스에 넣자.

:
Posted by 유쾌한순례자
2010. 12. 12. 00:23

타입을 정의할 때만 인터페이스를 사용 Study/Java2010. 12. 12. 00:23

인터페이스는 참조하는데 사용될 수 있는 타입의 역할을 하는데 이외의 목적으로는 좋지않다.

소위 말하는 상수 인터페이스 등이 있는데 메소드를 갖지 않으며 외부에 제공하는 상수 값을 갖는 static final 필드 만으로.

ex)

interface Sangsu{
static final int A = 2;
static final int B = 3;
static final int C = 10;
}

문제점이 뭐가 있을까.

이 상수를 더 이상 사용할 필요가 없어서 클래스를 변경하더라도 바이너리 호환성 유지를 위해

여전히 인터페이스를 구현해야한다.

이럴 때는 상수 유틸리티 클래스(유형4) 로 구현하는게 좋다.

public class Sangsu{
private Sangsu(){
public static final A = 2;
public static final B = 3;
public satic final C = 10;
}
}

즉 인터페이스는 타입을 정의할 뿐이고 상수를 외부에 제공되기 위한 목적이 아니다.
:
Posted by 유쾌한순례자
2010. 12. 11. 23:28

인터페이스 Study/Java2010. 12. 11. 23:28

인터페이스란?

구현 된 것은 아무것도 없는 밑바탕만 있는 "기본 설계도" 라고 생각하면 된다.

인터페이스 작성방법
ex)
interface 인터페이스 이름{
//모든 멤버변수는 public static final 이어야 하고
//모든 메서드는 public abstract 이어야한다.
}
내가 기존에 알고 있던 인터페이스는 C++ 에는 있지만 자바에는 없는 다중 상속을 사용할 때

기존의 다중상속의 장점만을 취해서 하는 것이라고 생각했다.

(※자바의 정석 298page 에 보면 인터페이스가 단순히 다중 상속을 위한 것으로 오해를 사고는 하는데 공부를 하다보면 참된 의미를 알 것이라고 하였다.)

ex)
interface A{
..생략..
}
interface B{
..생략..
}
interface C extends A,B{
..생략..
}

인터페이스의 장점만을 적어보자면 (자바의 정석 page 303)

1. 개발 시간을 단축 : 메서드를 호출 하는 쪽에서는 메서드의 내용에 관계없이 선언부만 알면됨!
2. 표준화가 가능 : 기본틀을 인터페이스로 작성하여 일관화되고 정형화된 개발이 가능
3. 서로 관계없는 클래스들끼리 관계를 맺어 줌 : 하나의 인터페이스를 공통적으로 구현하도록 관계를 맺어줌.
4. 독립적인 프로그래밍 가능 : 선언과 구현을 분리시킬 수 있다.

문제 : (interface를 사용할것!)
온풍기 냉풍기 가 가능한 에어콘이 있다.
on 이라는 명령을 내리고 설정온도를 입력하면 25도 초과일때 Hot mode
25도 미만일때 Cold mode
25도 일때 Air Care mode
로 출력하게 하며
off 일때는 종료가 엉뚱한 명령어가 입력되거나 최대값 30도, 최저값 18도 범위 밖일 경우도 종료시켜라.

음. 내가 만든 문제는 아니고 어디선가 봤던 문제인듯.

(정답을 몰라서 일단 내 코딩을 등록해두고 과감히 평가받기)


import javax.swing.JOptionPane;
interface Airconable{
abstract void mode(int temp);
}

class Aircon{
private int max_temp = 30;
private int min_temp = 18;
void operate(String operate, int temp){
if(operate.equals("on")){
if(control(temp)){
System.out.println("작동중");
}
else{
System.exit(0);
}
}
else if(operate.equals("off")){
System.out.println("정지");
System.exit(0);
}
else{
System.out.println("잘못입력했습니다");
System.exit(0);
}
}
boolean control(int temp){
System.out.println(temp+"도로 설정되었습니다.");
if(temp > max_temp){
System.out.println("온도가 너무 높게 설정되었습니다."+"종료합니다.");
return false;
}
else if(temp<min_temp){
System.out.println("온도가 너무 낮게 설정되었습니다."+"종료합니다.");
return false;
}
else{
return true;
}
}
}

class SelectMode extends Aircon implements Airconable{
SelectMode(String operate, int temp){
super.operate(operate,temp);
mode(temp);
}
@Override
public void mode(int temp) {
if(temp>25){
System.out.println("HOT MODE");
}
else if(temp<25){
System.out.println("COLD MODE");
}
else{
System.out.println("AIR CORE MODE");
}
}
}
public class aircon2 {
public static void main(String args[]){
String oper = "";
String question = "";
int temp = 25;
oper = JOptionPane.showInputDialog("시작:on  ,    종료:off.");
if(oper.equals("on")){
question = JOptionPane.showInputDialog("온도를 입력하세요.");
temp = Integer.parseInt(question);
}
SelectMode sm = new SelectMode(oper, temp);
}
}
:
Posted by 유쾌한순례자

추상클래스로 정의된 타입을 구현하는 클래스는 반드시 추상 클래스의 서브 클래스가 되어야 한다.

인터페이스를 구현하는 클래스의 경우는 인터페이스에 정의된 모든 메소드를 구현하고 인터페이스 구현 계약을 지키면

되므로 클래스 상속계층과는 무관하다.

각각의 장점(?) 즉 외부에 공개된 중요한 인터페이스와 연관시킨 골격 구현 추상클래스를 제공하여 인터페이스와

추상 클래스의 장점을 결합한다.

골격 구현 클래스의 작성법은 다음과 같다.

우선 대상이 되는 인터페이스를 파악하고, 구현할 메소드와 그대로 둘 메소드를 결정한다

그대로 둘 메소드가 골격 구현 클래스의 추상 메소드가 될 것이다.

그다음 그대로 둘 메소드를 제외한 인터페이스의 나머지 모든 메소드를 구현한다.

다음의 예제를 한번 보면 좀 더 이해가 갈 것 같다.

public abstract class AbstractMapEntry<K,V> implements Map.Entry<K,V> {
public abstract K getKey();
public abstract V getValue();

public V setValue(V value){
throw new UnsupportedOperationException();
}

//기타 Map.Entry.equals 메소드에 약속된 보면적 계약은 생략...
}

음 여기 항목도 결론은 상황에 따라 추상 클래스와 인터페이스 중 잘 선택해서 쓰자 라는 것.

추상 클래스는  진화의 용이성 이 중요할 때

인터페이스는 유연성이 중요할 때  인 것 같다.

:
Posted by 유쾌한순례자