Objective_C 2020. 4. 13. 18:57

1.메시지 문법
C++ : Reveiver.MessageWithOptionAandOptionB(23,23,23);
Objective-C : [Reveiver Message:23 withOptionA:23 WithOptionB:23]; //이름을 중간에 띄어서 처처리한다 생각하면될 듯
2. nil값을 가지는 클래스 인스턴스의 메소드 호출하지
Rectangle *anObject = nil;
[anObject description];
nil는 다른 언어의 'NULL' 과 동일한 개념
위 예제는 nil 값을 가지는 anObject 인스턴스의 description 메소드를 호출한다. 다른 언어에서는 당연히 런타임 에러가 발생하지만 Objective-C는 에러로 처리하지 않고 정상적 동작으로 인식하고 처리한다. 이값은 경우 메소드 호출 결과로 nil을 돌려준다
3. Objective-C의 데이터 타입
3-1. id 타입
id anObject;
id 는 Objective-C의 기본 데이터 타입이다. 이건 모든 종류의 객체들을 다룰수 있다.
참고로 일반적으로 id의 형태로 사용되고 id* 와 같은 형태로는 잘 사용되지 않는다.
3-2. BOOL 데이터타입
BOOL flag = YES;
if(flag ==YES){
flag = NO;
}
3-3. 함수 포인터 데이터 타입
Objective-C 는 C의 함수 포인터와 유사한 개념으로 'SEL' 이라는 데이터 타입을 지원한다. 이것은 @selector 지시어와 임의의 메소드 이름을 사용하여 값을 설정한다.
이때 메소드 이름에 콜론도 포함되는 것을 일지 말아야한다.
//함수 선언
-(void)setWidth:(NSInteger)myWidth height:(NSInteger)myHeight;
-(void)setCallback:(SEL)callback;
//함수 호출
SEL anObject = @selector(seWidth:height:);
 
[self setCallback:anObject];
[self setCallback:@selector(setWidth:height:)];
 
3-4 Objective-C의 클래스
3-4-1 클래스의 상속
-단일 클래스로부터의 상속 기능만 지원,
3-4-2 NSObject 클래스
-부모 클래스가 없는 루트 클래스인 NSObject는 Objective-C의 객체들을 위한 기본 프레임워크로, 객체 사이의 상호 작용을 정의한다.
그래서 이를 상속하는 클래스가 객체로 동작하게 하고, 런타임 시스템과 상호동작할수 있도록 해준다.
다른 클래스와 특별한 연관관계가 없는 클래스도 그것을 생성할 때는 반드시 NSObject를 상속해야한다.
클래스의 인스턴스들이 실행될 때 최소한 Objective-C의 객체로서 동작할 수 있어야 하기 때문에 클래스를 새로 설계할 떄 NSObject를 기본적으로 상속해야 함을 절대로 잊지말자. 만일 아무런 클래스도 상속하지 않는 독자적인 클래스를 만들게 되면 이 클래스는 Objective-C의 객체가 가져야 하는 기본적인 성질들을 가질 수 없게 된다.
 
3-4-3. 인스턴스 변수의 상속
한 클래스로부터 인스턴스를 만들면 , 그 인스턴스에는 해당 클래스에 정의되어 있는 인스턴스 변수는 물론 그 부모 클래스의 인스턴스 변수 그리고 또 부모의 부모 클래스의 인스턴스 변수까지, 최종적으로 루트 클래스의 인스턴스 변수까지 모두 포함된다.
3-4-4. 메소드의 상속
부모 클래스를 상속하는 자식 클래스는 부모 클래스뿐 아니라 최종적으로 루트 클래스에 이르기까지 상위에 있는 모든 클래스의 메소드들을 상속받아 사용할 수 있다. 즉 파운데이션 프레임워크 내의 한 클래스를 상속하면 해당 클래스 및 그 상위 클래스들이 가지고 있는 메소드들을 모두 사용할 수 있으며, 추가로 필요한 메소드만 선언하면된다.
3-4-5. 메소드 오버라이딩
메소드 오버라이딩(Overriding)이란 자식 클래스에서 부모 클래스의 메소드를 재정의해서 사용하는 것이다. (다른언어와 동일) 이를 통해 메소드의 동작을 완전히 재정의하거나 새로운 기능을 추가할수 있다.
아래의 코드는 자식 클래스에서 부모 클래스의 메소드(draw)를 오버라이딩하는 전형적인 예를 보여준다. 우선 부모 클래스의 메소드를 호출하여 원래 이메소드에 구현되어 있던 동작을 수행하고 이어서 새로운 기능을 수행하는 방식이다. 부모 클래스의 메소드를 호출할 때 super 지시어를 사용해야 한다는 점을 유의하자,.

-(void)draw{ //1.부모 클래스의 해당 메소드를 호출한다.
[super draw]; //2.새로운 기능을 추가한다.
}

단, Objective-C에서는 메소드 오버로딩(Overloading)은 지원하지 않음을 기억해두자
(오버로딩은 메소드의 이름은 같지만 입출력 값의 타입은 다르게 선언하는 것을 말한다.
3-4-6. 클래스의 생성
id myRectangle = [[Rectangle alloc] init];
 
alloc 메소드는 Rectangle 클래스의 인스턴스 변수들에 메모리를 할당하고 이를 리턴하게 된다.
그런데 이때 인스턴수들의 변수들을 모두 0의 값을 가지게 되므로 init 메소드를 호출하여 초기화를 수행해야함
실제로 모든 클래스는 메모리를 할당하고 초기화 하는 메소드를 적어도 하나 이상 가지고 있다. 파운데이션 프레임워크의 클래스들을 살펴보면 주로 사용하는 초기화 메소드의 이름 및 인자의 개수 등은 조금씩 다르지만 일반적으로 init으로 시작하는 이름의 초기화 메소드가 있음을 알수 있다.
3-4-7 클래스 타입
Rectangle *myRectangle = [[Rectangle alloc] init];
id idRectangle = myRectangle; // id 타입 변수에 저장가능
 
id는 Objective-C의 기본 데이터 타입이며, 어떠한 클래스도 이와 같은 방식으로 사용할 수 있다. 실제 프로그래밍에서 여러 클래스의 인스턴스를 사용하는 경우 이처럼 id 타입의 변수를 이용하는 것이 유용한 경우가 많다.
만약 Rectangle 의 부모가 Shape 라면 아래처럼도 가능한다.
 
Shape *myGraphic = myRectangle;
 
3-4-8. 타입 검사
-isKindOfclass & isMemberOfClass 는 NSObject 클래스를 상속하는 모든 클래스에서 이용할수 있다.
//딱 그 특정클래스의 인스턴스인지 알아내는 기능
if([anObject isMemberOfClass:[Shape class]]{ …}
//특정클래스 또는 그 하위에 속한 클래스인지 알아내는 기능
if([anObject isKindOfclass:[Shape class]]){…}
 
3-4-9. 동일성 검사
//두 인스턴스가 실제로 같은 메모리 주소를 가리키는 동일 인스턴스인지를 검사 같은 경우 참
if(anobject1 ==anObject2){ ..}
//메모리주소가 아닌 실제 두 객체가 가지고 있는 인스턴스 내의 값들이 같은지 검사하고 같은 경우 참
if([anObject1 isEaual:anObject2]){..}
 
3-4-10.메소드 검사
respondsToSelector : 메소드는 (NSObject에서 사용 가능) 인자로 받는 메소드가 자신을 호출하고 있는 객체내에서 정의되어 있는지 여부를 검사하는 역할을 수행

id anObject =nil;

if([anObject respondsToSelector:@selector(draw)])
{..}

anObject 인스턴스 안에 draw 메소드를 가지고 있는지 파악
4.클래스 선언 및 정의하기
4-1.헤더 파일과 소스파일 분리
.h 파일: 헤더파일
.m 파일: 소스파일
.mm 파일: C++소스를 포함하거나 참조하고 있는 파일
 
4-2.헤더 파일

#import<Foundation/Foundation.h>
#import "Shape.h"    //(1)
 
@class Circle;        //(2)
@interface Rectangle : Shape {    //(3)
    NSString *name;        //(4)
    NSInteger width;
    NSInteger height;
}
 
-(NSString *)description;    //(5)
-(void)setName:(NSString*)myName;
-(void)setWidth:(NSInteger)myWidth height:(NSInteger)myHeight;
-(void)draw;

'Objective_C' 카테고리의 다른 글

[Objective-C] 기초배우기 (4)  (0) 2020.04.14
[Objective-C] 기초배우기 (3)  (0) 2020.04.14
[Objective-C] 기초배우기 (2)  (0) 2020.04.14
posted by 핵커 커뮤니티
:
JSP 2020. 4. 13. 18:53

어떤 데이터를 서버가 아닌 클라이언트에 서버의 명령에 의해서 저장된 것을 쿠키(Cookie)라고 한다.
데이터를 클라이언트의 로컬에 저장하여 보안상 문제가 있기 때문에, 요즘에는 잘 사용하지 않는 기술이다.

데이터가 별로 중요하지 않고, 서버의 자원을 절약해야 할 경우에 사용할 수 있는 기법이다.

[Make Cookie]

<%
Cookie cookie= new Cookie("CookieName", "CookieValue");

// set valid time of cookie
// parameter is second.
cookie.setMaxAge(60*60);

// add cookie to response object
response.addCookie(cookie);
%>

쿠키 객체를 만들고, 쿠키의 유효 기간을 설정한다.

쿠키의 속성이 모두 정의되면 response객체에 쿠키를 추가한다.

[Get Cookies]

<%
Cookie[] cookies= request.getCookies();
  if(cookies!= null){
for(int i=0; i<cookies.length; i++){
out.println("cookies["+i+"] Name= "+ cookies[i].getName()+ "<br/>");
out.println("cookies["+i+"] Value= "+ cookies[i].getValue()+"<br/>");
out.println("================================"+"<br/>");
}
   }
%>

Cookie 객체를 가져올 때는 만들 때와는 반대로 request객체에서 받아온다.

Cookie는 여러 개일 수도 있으므로, Array type으로 받는다.

모든 쿠키를 탐색하기 위해 for문을 이용해 모든 Cookie 객체를 탐색한다.

getName()은 쿠키의 이름을, getValue()는 쿠키의 값을 반환한다.


[Delete Cookie]

<%
Cookie[] cookies= request.getCookies();
for(int i=0; i<cookies.length; i++){
String cookieName=cookies[i].getName();
if(cookieName.equals("CookieName")){
out.println("cookies["+i+"] Name= "+ cookies[i].getName()+ "<br/>");
out.println("cookies["+i+"] Value= "+ cookies[i].getValue()+"<br/>");

out.println("This Cookies will be deleted"+ "<br/>");

// This process that set valid period of cookie and save cookie means targetCookie is deleted.
cookies[i].setMaxAge(0);
response.addCookie(cookies[i]);

out.println("================================"+"<br/>");
}
}
%>

쿠키를 직접 삭제하는 어떤 특정 메소드가 존재하지 않는다.

그래서 특정 쿠키의 유효시간을 0으로 만들어 유효하지 않은 쿠키로 만들어 간접적으로 삭제하는 방법을 이용한다.

cookes[i].setMaxAge메소드의 인자값을 0으로 만들고 
유효시간이 만료된 쿠키를 response.addCookie()로 다시 추가해줌으로써 쿠키를 삭제하는 효과를 얻는다.

'JSP' 카테고리의 다른 글

[JSP] 기초 간단하게 정리  (0) 2020.04.13
posted by 핵커 커뮤니티
:
JSP 2020. 4. 13. 18:49

web page에서 java code를 사용하려면 기본적으로 .html이 아닌 .jsp파일을 이용한다.

[Java Code 사용을 Declare]

<% JavaCode.... %> 형식을 따른다.

예를 들어 <% int i=0; System.out,.println(i); %> 와 같은 형식으로 한다.
jsp파일에는 자바 코드가 드러나지만, 실제로 실행시키면 사용자에겐 html문서 형식으로 보여지며
JavaCode는 해당 요소로 변환되어 JavaCode는 보이지 않게 된다.

[Variable Print]

단순히 변수의 출력만을 원할 경우에는 <%= Variable %> 와 같은 형식으로 한다.
<% out,println(Variable); %>처럼 쓸 수도 있지만 코드가 길어질 염려가 있다.

[Import Other Class or Package]

<%@page import="Package or Class" %> 처럼 한다.
일반적인 자바의 import [package or class]; 문법과 같다.
효력은 이 태그가 사용된 페이지에 한해 import된다.

예를 들어 <%@page import="java.util.Arrays"%> 했다면


<%
int[] arr= {10,20,30};
out.println(Arrays.toString(arr));
%>

처럼 Arrays Class를 사용할 수 있다.

[Page in Page]

include Attribute를 이용하여 페이지에서 다른 페이지를 포함시킬 수도 있다.
홈페이지의 카테고리와 같이, 여러 페이지에서 공통되게 사용하는 부분들은 따로 만들어서 include하는 방식을 취한다.

<%@ include file="IncludedJSP.jsp" %>

[주석(Comment)]

<%-- --> 또는 자바에서와 같이 //나 /* */ 를 사용한다.

[페이지 속성 정의]
<%@ page language="java" contentType="text/html; charset="EUC-KR"
    pageEncoding="EUC-KR"%>

JSP파일을 만들면 이 태그는 자동으로 생성된다.

어떤 언어를 사용하고, 언어 인코딩 방식은 어떤 것으로 할지 정의하는 부분이다.

EUC-KR을 사용하지 않으면, 영어는 관계없지만 한국어는 문자가 깨져서 출력되게 되므로 반드시 설정한다.

'JSP' 카테고리의 다른 글

[JSP] 쿠키(Cookle) 클라이언트 서버 명령 소스  (0) 2020.04.13
posted by 핵커 커뮤니티
:
C샵 2020. 4. 13. 18:45

 //열기창 생성
OpenFileDialog oDialog = new OpenFileDialog();
oDialog.Filter = "텍스트 파일|*.txt";
//열기창 띄우고 내용 반환
if (oDialog.ShowDialog() == DialogResult.OK)
{
    string a = System.IO.File.ReadAllText(oDialog.FileName, Encoding.Default);
}

posted by 핵커 커뮤니티
:
C샵 2020. 4. 13. 18:42

// 상단에 using지시문 추가
using WinHttp; // 오류가 뜰 경우 참고 추가로 winhttp.dll 추가하시면 됩니다.
// 추가 방법은 찾아보기 - C:\windows\System32 에서 저 winhttp 검색하시면 됩니다. (32비트 기준)
 
// 네이버 계정 및 카페 인증
bool NaverLogin(string ID, string PW)
        {
            WinHttpRequest WinHttp = new WinHttpRequest();
            WinHttp.Open("POST", "https://nid.naver.com/nidlogin.login", false);
            WinHttp.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            WinHttp.SetRequestHeader("Referer", "https://nid.naver.com/nidlogin.login");
            WinHttp.Send("enctp=2&url=http://www.naver.com&enc_url=http://www.naver.com&postDataKey=&saveID=0&nvme=0&smart_level=1&id=" + ID + "&pw=" + PW);
            WinHttp.WaitForResponse();
            WinHttp.Open("GET", "http://cafe.naver.com/"); // 해당 카페 주소 입력
            WinHttp.Send("");
            WinHttp.WaitForResponse();
            string result = Encoding.Default.GetString(WinHttp.ResponseBody);
            if (result.IndexOf("카페멤버") == -1) // 이건 WinHttp.ResponseText.IndexOf("카페멤버") 이렇게 사용하면 오류가 뜨더라구요
            {
                return false; // 카페 가입이 되어있으면 저 "카페멤버" 라는 글자가 표시되지 않습니다.
            }
            else
            {
                return true; // 카페 가입이 되어있지않으면 저 "카페멤버" 라는 글자가 표시됩니다.
            }
        }
 
이렇게 하시고 버튼 이벤트에
 
// NaverLogin 이 false 값일 경우 (가입 되어있을 경우)
// NaverLogin 이 true 값일 경우 (가입 되어있지 않을 경우)
 if (NaverLogin(textBox1.Text, textBox2.Text) == false)
            {
                // false 값이면 성공
                MessageBox.Show("네이버 인증에 성공하였습니다.", "성공!", MessageBoxButtons.OK);
            }
            else
            {
                // true 값이면 실패
                MessageBox.Show("네이버 인증에 실패하였습니다.", "실패!", MessageBoxButtons.OK);
            }

'C샵' 카테고리의 다른 글

[C#] C# 데이터 타입 배워보기 (종류)  (1) 2020.04.16
[C#] C#의 버전 알아보자  (0) 2020.04.16
[C#] C#이란 무엇일까? 기초알아보기 (1)  (0) 2020.04.16
[C#] TXT 불러오기 소스  (0) 2020.04.13
posted by 핵커 커뮤니티
:
C언어 2020. 4. 13. 18:38

기본적인 C언어란 프로그래밍 언어이다.

컴퓨터와의 대화에 사용하기 위해 일종의 의사소통이다.

ex) 한국인 영어> 통역사(컴퓨터 본체) > 일본인
ex) > 한국말 영어> 통역사 > 일본말 > 일본인
이런식으로 가능한 조건이 C언어이다.
하지만 컴퓨터에서는 의사소통이 불가능이므로  C언어로 의사소통 할수있다.
ex) 한국어 C언어 > 컴파일러(C언어 기계어) > 컴퓨터
*컴파일러이란? > 프로그래밍 언어로 작성한 프로그램을 컴퓨터가 이해할 수 있도록 기계어로 번역하는역할을합니다. (Compile)
*기계어란? 컴퓨터가 이해할 수 있도록 0과1로 구성된 언어체계입니다.

posted by 핵커 커뮤니티
:
DelPhi 2020. 4. 12. 14:00

{ 여기서 부터 dll 작성부분이다 }

{ 여기서 두함수가 DLL 함수가 된다 }

library Firstdll;

uses

Windows;

 

function Triple( N : Integer) : Integer; stdcall;

begin

MessageBox(0,'Triple function called',

'First Dll',mb_Ok);

Result := N * 3;

end;

function Double( N : Integer) : Integer; stdcall;

begin

MessageBox(0,'Double function called',

'First Dll',mb_Ok);

Result := N * 2;

end;

exports

Triple , Double;

begin

end.

{ 여기까지가 Dll 작성 루틴이다 }

{ 여기서 부터는 DLL 에 있는 함수를 호출하는것을 보여주는 예이다.}

unit dllcall;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Spin;

type

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

SpinEdit1: TSpinEdit;

SpinEdit2: TSpinEdit;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

{ DLL 함수를 선언한다 }

function Double( N : Integer) : Integer;

stdcall; external 'FirstDll.dll';

function Triple( N : Integer) : Integer;

stdcall; external 'FirstDll.dll';

implementation

{$R *.DFM}

{DLL 함수의 호출}

procedure TForm1.Button1Click(Sender: TObject);

begin

SpinEdit1.Value := Double(SpinEdit1.Value);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

SpinEdit2.Value := Triple(SpinEdit2.Value);

end;

end.

----- Dfm 파일 -----

object Form1: TForm1

Left = 200

Top = 108

Width = 328

Height = 156

Caption = 'Form1'

Font.Charset = DEFAULT_CHARSET

Font.Color = clWindowText

Font.Height = -11

Font.Name = 'MS Sans Serif'

Font.Style = []

PixelsPerInch = 96

TextHeight = 13

object Button1: TButton

Left = 24

Top = 24

Width = 75

Height = 25

Caption = 'Double'

TabOrder = 0

OnClick = Button1Click

end

object Button2: TButton

Left = 24

Top = 80

Width = 75

Height = 25

Caption = 'Triple'

TabOrder = 1

OnClick = Button2Click

end

object SpinEdit1: TSpinEdit

Left = 144

Top = 24

Width = 121

Height = 22

MaxValue = 0

MinValue = 0

TabOrder = 2

Value = 0

end

object SpinEdit2: TSpinEdit

Left = 144

Top = 80

Width = 121

Height = 22

MaxValue = 0

MinValue = 0

TabOrder = 3

Value = 0

end;

end;

posted by 핵커 커뮤니티
:
DelPhi 2020. 4. 12. 13:54

1.Classes 추가

 

 uses 

 Classes;

2.값을 저장하고 불러올 Packed record를 만듭니다!

 type

 TPerson = Packed record 

 sName : Array[1..50] of Char;

 nAge   : Integer; 

 end;

 //저장할 데이터의 크기를 고정시켜줍니다.

 

 var

 Person : TPerson;

 

 3. dll 저장!

  procedure WriteDll;

 

  var

  sFilePath : string;

  Stream   : TMemoryStream;

 

  begin

  sFilePath := '저장될 경로명' + '파일명.dll';

  Stream := TMemoryStream.Create;

 

  try

  Stream.Clear;

  Stream.Write(Person, SizeOf(TPerson))

   Stream.SaveToFile(sFilePath);

   finally

   Stream.Free;

   end;

  4.dll 불러옵니다

  procedure ReadDll;

  var

 sFilePath : string;

  Stream   : TMemoryStream;

begin

  sFilePath := '불러올 경로명' + '파일명.dll';

   Stream := TMemoryStream.Create;

   FillChar(Person, Sizeof(TPerson), #0); //공백으로 채워줍니다.  

  try

  Stream.LoadFromFile(sFilePath); 

  Stream.Position := 0;

  Stream.Read(Person, SizeOf(TPerson)); 

  finally

  Stream.Free;

  //공백으로 채웠기 때문에 Trim을 사용해 문자열의 양쪽 공백을 제가한뒤 사용

 ShowMessage(Trim(Person.sName));

  end;

posted by 핵커 커뮤니티
: